Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
wine
Manage
Activity
Members
Labels
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Package registry
Container Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Alexey Alyaev
wine
Commits
ff25db08
Commit
ff25db08
authored
19 years ago
by
Gerold Jens Wucherpfennig
Committed by
Alexandre Julliard
19 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Support for big-endian systems.
parent
db7fc1cd
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
dlls/cabinet/fci.c
+106
-2
106 additions, 2 deletions
dlls/cabinet/fci.c
with
106 additions
and
2 deletions
dlls/cabinet/fci.c
+
106
−
2
View file @
ff25db08
...
...
@@ -23,7 +23,6 @@
There is still some work to be done:
- currently no support for big-endian machines
- the ERF error structure aren't used on error
- no real compression yet
- unknown behaviour if files>4GB or cabinet >4GB
...
...
@@ -44,6 +43,7 @@ There is still some work to be done:
#include
"windef.h"
#include
"winbase.h"
#include
"winerror.h"
#include
"winternl.h"
#include
"fci.h"
#include
"cabinet.h"
...
...
@@ -442,7 +442,41 @@ static cab_ULONG fci_get_checksum(void *pv, UINT cb, CHECKSUM seed)
}
/* end of fci_get_checksum */
static
inline
cab_ULONG
fci_set_little_endian_ulong
(
cab_ULONG
i
)
{
#ifdef WORDS_BIGENDIAN
return
RtlUlongByteSwap
(
i
);
#else
return
i
;
#endif
}
static
inline
cab_ULONG
fci_get_little_endian_ulong
(
cab_ULONG
i
)
{
#ifdef WORDS_BIGENDIAN
return
RtlUlongByteSwap
(
i
);
#else
return
i
;
#endif
}
static
inline
cab_UWORD
fci_set_little_endian_uword
(
cab_UWORD
i
)
{
#ifdef WORDS_BIGENDIAN
return
RtlUshortByteSwap
(
i
);
#else
return
i
;
#endif
}
static
inline
cab_UWORD
fci_get_little_endian_uword
(
cab_UWORD
i
)
{
#ifdef WORDS_BIGENDIAN
return
RtlUshortByteSwap
(
i
);
#else
return
i
;
#endif
}
static
BOOL
fci_flushfolder_copy_cfdata
(
HFCI
hfci
,
char
*
buffer
,
UINT
cbReserveCFData
,
...
...
@@ -599,12 +633,19 @@ static BOOL fci_flushfolder_copy_cfdata(HFCI hfci, char* buffer, UINT cbReserveC
return
FALSE
;
}
/* set little endian */
pcfdata
->
cbData
=
fci_set_little_endian_uword
(
pcfdata
->
cbData
);
pcfdata
->
cbUncomp
=
fci_set_little_endian_uword
(
pcfdata
->
cbUncomp
);
/* get checksum and write to cfdata.csum */
pcfdata
->
csum
=
fci_get_checksum
(
&
(
pcfdata
->
cbData
),
sizeof
(
CFDATA
)
+
cbReserveCFData
-
sizeof
(
pcfdata
->
csum
),
fci_get_checksum
(
p_fci_internal
->
data_out
,
/*buffer*/
pcfdata
->
cbData
,
0
)
);
/* set little endian */
pcfdata
->
csum
=
fci_set_little_endian_ulong
(
pcfdata
->
csum
);
/* write cfdata with checksum to p_fci_internal->handleCFDATA2 */
if
(
PFCI_WRITE
(
hfci
,
p_fci_internal
->
handleCFDATA2
,
/* file handle */
buffer
,
/* memory buffer */
...
...
@@ -617,6 +658,11 @@ static BOOL fci_flushfolder_copy_cfdata(HFCI hfci, char* buffer, UINT cbReserveC
p_fci_internal
->
sizeFileCFDATA2
+=
sizeof
(
CFDATA
)
+
cbReserveCFData
;
/* reset little endian */
pcfdata
->
cbData
=
fci_get_little_endian_uword
(
pcfdata
->
cbData
);
pcfdata
->
cbUncomp
=
fci_get_little_endian_uword
(
pcfdata
->
cbUncomp
);
pcfdata
->
csum
=
fci_get_little_endian_ulong
(
pcfdata
->
csum
);
/* write compressed data into p_fci_internal->handleCFDATA2 */
if
(
PFCI_WRITE
(
hfci
,
p_fci_internal
->
handleCFDATA2
,
/* file handle */
p_fci_internal
->
data_out
,
/* memory buffer */
...
...
@@ -649,6 +695,7 @@ static BOOL fci_flushfolder_copy_cfdata(HFCI hfci, char* buffer, UINT cbReserveC
/* reset checksum, it will be computed later */
pcfdata
->
csum
=
0
;
/* write cfdata WITHOUT checksum to handleCFDATA1new */
if
(
PFCI_WRITE
(
hfci
,
handleCFDATA1new
,
/* file handle */
buffer
,
/* memory buffer */
...
...
@@ -965,6 +1012,14 @@ static BOOL fci_flushfolder_copy_cffile(HFCI hfci, int* err, int handleCFFILE1ne
cffile
.
iFolder
=
cffileCONTINUED_TO_NEXT
;
}
/* set little endian */
cffile
.
cbFile
=
fci_set_little_endian_ulong
(
cffile
.
cbFile
);
cffile
.
uoffFolderStart
=
fci_set_little_endian_ulong
(
cffile
.
uoffFolderStart
);
cffile
.
iFolder
=
fci_set_little_endian_uword
(
cffile
.
iFolder
);
cffile
.
date
=
fci_set_little_endian_uword
(
cffile
.
date
);
cffile
.
time
=
fci_set_little_endian_uword
(
cffile
.
time
);
cffile
.
attribs
=
fci_set_little_endian_uword
(
cffile
.
attribs
);
/* write cffile to p_fci_internal->handleCFFILE2 */
if
(
PFCI_WRITE
(
hfci
,
p_fci_internal
->
handleCFFILE2
,
/* file handle */
&
cffile
,
/* memory buffer */
...
...
@@ -977,6 +1032,14 @@ static BOOL fci_flushfolder_copy_cffile(HFCI hfci, int* err, int handleCFFILE1ne
p_fci_internal
->
sizeFileCFFILE2
+=
sizeof
(
cffile
);
/* reset little endian */
cffile
.
cbFile
=
fci_get_little_endian_ulong
(
cffile
.
cbFile
);
cffile
.
uoffFolderStart
=
fci_get_little_endian_ulong
(
cffile
.
uoffFolderStart
);
cffile
.
iFolder
=
fci_get_little_endian_uword
(
cffile
.
iFolder
);
cffile
.
date
=
fci_get_little_endian_uword
(
cffile
.
date
);
cffile
.
time
=
fci_get_little_endian_uword
(
cffile
.
time
);
cffile
.
attribs
=
fci_get_little_endian_uword
(
cffile
.
attribs
);
/* write file name to p_fci_internal->handleCFFILE2 */
if
(
PFCI_WRITE
(
hfci
,
p_fci_internal
->
handleCFFILE2
,
/* file handle */
p_fci_internal
->
data_out
,
/* memory buffer */
...
...
@@ -1580,6 +1643,18 @@ static BOOL fci_flush_cabinet(
cfheader
.
iCabinet
=
p_fci_internal
->
pccab
->
iCab
-
1
;
}
/* set little endian */
cfheader
.
reserved1
=
fci_set_little_endian_ulong
(
cfheader
.
reserved1
);
cfheader
.
cbCabinet
=
fci_set_little_endian_ulong
(
cfheader
.
cbCabinet
);
cfheader
.
reserved2
=
fci_set_little_endian_ulong
(
cfheader
.
reserved2
);
cfheader
.
coffFiles
=
fci_set_little_endian_ulong
(
cfheader
.
coffFiles
);
cfheader
.
reserved3
=
fci_set_little_endian_ulong
(
cfheader
.
reserved3
);
cfheader
.
cFolders
=
fci_set_little_endian_uword
(
cfheader
.
cFolders
);
cfheader
.
cFiles
=
fci_set_little_endian_uword
(
cfheader
.
cFiles
);
cfheader
.
flags
=
fci_set_little_endian_uword
(
cfheader
.
flags
);
cfheader
.
setID
=
fci_set_little_endian_uword
(
cfheader
.
setID
);
cfheader
.
iCabinet
=
fci_set_little_endian_uword
(
cfheader
.
iCabinet
);
/* write CFHEADER into cabinet file */
if
(
PFCI_WRITE
(
hfci
,
handleCABINET
,
/* file handle */
&
cfheader
,
/* memory buffer */
...
...
@@ -1590,6 +1665,18 @@ static BOOL fci_flush_cabinet(
}
/* TODO error handling of err */
/* reset little endian */
cfheader
.
reserved1
=
fci_get_little_endian_ulong
(
cfheader
.
reserved1
);
cfheader
.
cbCabinet
=
fci_get_little_endian_ulong
(
cfheader
.
cbCabinet
);
cfheader
.
reserved2
=
fci_get_little_endian_ulong
(
cfheader
.
reserved2
);
cfheader
.
coffFiles
=
fci_get_little_endian_ulong
(
cfheader
.
coffFiles
);
cfheader
.
reserved3
=
fci_get_little_endian_ulong
(
cfheader
.
reserved3
);
cfheader
.
cFolders
=
fci_get_little_endian_uword
(
cfheader
.
cFolders
);
cfheader
.
cFiles
=
fci_get_little_endian_uword
(
cfheader
.
cFiles
);
cfheader
.
flags
=
fci_get_little_endian_uword
(
cfheader
.
flags
);
cfheader
.
setID
=
fci_get_little_endian_uword
(
cfheader
.
setID
);
cfheader
.
iCabinet
=
fci_get_little_endian_uword
(
cfheader
.
iCabinet
);
if
(
cfheader
.
flags
&
cfheadRESERVE_PRESENT
)
{
/* NOTE: No checks for maximum value overflows as designed by MS!!! */
cfreserved
.
cbCFHeader
=
cbReserveCFHeader
;
...
...
@@ -1600,6 +1687,10 @@ static BOOL fci_flush_cabinet(
}
else
{
cfreserved
.
cbCFData
=
p_fci_internal
->
pccab
->
cbReserveCFData
;
}
/* set little endian */
cfreserved
.
cbCFHeader
=
fci_set_little_endian_uword
(
cfreserved
.
cbCFHeader
);
/* write reserved info into cabinet file */
if
(
PFCI_WRITE
(
hfci
,
handleCABINET
,
/* file handle */
&
cfreserved
,
/* memory buffer */
...
...
@@ -1609,6 +1700,9 @@ static BOOL fci_flush_cabinet(
return
FALSE
;
}
/* TODO error handling of err */
/* reset little endian */
cfreserved
.
cbCFHeader
=
fci_get_little_endian_uword
(
cfreserved
.
cbCFHeader
);
}
/* add optional reserved area */
...
...
@@ -1735,6 +1829,11 @@ static BOOL fci_flush_cabinet(
}
}
/* set little endian */
cffolder
.
coffCabStart
=
fci_set_little_endian_ulong
(
cffolder
.
coffCabStart
);
cffolder
.
cCFData
=
fci_set_little_endian_uword
(
cffolder
.
cCFData
);
cffolder
.
typeCompress
=
fci_set_little_endian_uword
(
cffolder
.
typeCompress
);
/* write cffolder to cabinet file */
if
(
PFCI_WRITE
(
hfci
,
handleCABINET
,
/* file handle */
&
cffolder
,
/* memory buffer */
...
...
@@ -1745,6 +1844,11 @@ static BOOL fci_flush_cabinet(
}
/* TODO error handling of err */
/* reset little endian */
cffolder
.
coffCabStart
=
fci_get_little_endian_ulong
(
cffolder
.
coffCabStart
);
cffolder
.
cCFData
=
fci_get_little_endian_uword
(
cffolder
.
cCFData
);
cffolder
.
typeCompress
=
fci_get_little_endian_uword
(
cffolder
.
typeCompress
);
/* add optional reserved area */
/* This allocation and freeing at each CFFolder block is a bit */
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment