"Francois Gouget" fgouget@free.fr wrote:
[...]
What is really fun, that usage of FILETIME instead of LARGE_INTEGER leads to differences in size of structures.
That's very strange. It would be good to understand why because this should not happen.
Any ideas, why does it happen? Is it due to the LONGLONG usage?
if (ft) *ft = info->LastWriteTime;
if (ft) *ft = *(FILETIME *)&info->LastWriteTime;
This cast should not be necessary. Both sides are FILETIMEs.
It's because according to ntddk.h from NT4 DDK info->LastWriteTime is LARGE_INTEGER. Please look at my patch a bit carefully.
- FILETIME modif;
- LARGE_INTEGER modif;
- RtlSecondsSince1970ToTime( req->modif, &modif );
RtlSecondsSince1970ToTime( req->modif, (FILETIME *)&modif );
Here I don't understant why you changed modif to a LARGE_INTEGER
since RtlSecondsSince1970ToTime takes a FILETIME*
Same comment as above.
- UINT type;
- LPVOID pvFilter;
} HDITEMA, *LPHDITEMA;
I don't see these two fields on Windows. Same thing for the W version. That's with the VC 6 headers.
It's in July 2000 PlatformSDK as well as in MSDN online.
typedef struct { DWORD cb;
- BYTE DeviceName[32];
- BYTE DeviceString[128];
- CHAR DeviceName[32];
- CHAR DeviceString[128]; DWORD StateFlags;
- CHAR DeviceID[128];
- CHAR DeviceKey[128];
} DISPLAY_DEVICEA,*PDISPLAY_DEVICEA,*LPDISPLAY_DEVICEA;
Hmm, no. It is 'BYTE' on Windows. And I don't see the two extra fields either.
Same comment as above.
- BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
} CONTEXT86;
I don't have this field in CONTEXT86, but it is there in CONTEXT. It seems that it's our definition of CONTEXT which is wrong: typedef CONTEXT86 CONTEXT;
Same comment as above.
typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; +#ifdef __WINE__ WORD TypeOffset[1]; +#endif } IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
Do we handle this correctly in the code? I.e. is there APIs where the application gives us a pointer to a struct without the field and we write to it? I wonder how this is supposed to work.
In winnt.h from the PlatformSDK it is just commented, but as you could assume Wine loader uses this field to relocate images.
+#include "pshpack4.h" typedef struct _LUID_AND_ATTRIBUTES { LUID Luid; DWORD Attributes; } LUID_AND_ATTRIBUTES; +#include "poppack.h"
Is this really necessary? LUID is 8 bytes so the DWORD should be aligned just fine with or without the pack4...
Without pshpack4.h sizeof(LUID_AND_ATTRIBUTES)=16 instead of 12. Don't ask me why. Both NT4 DDK (ntddk.h) and PlatformSDK (winnt.h) headers surround LUID_AND_ATTRIBUTES definition by "pshpack4.h"/"poppack.h" pair.
Thanks for your comments.
-- Dmitry.