diff options
author | Theodore Ts'o <tytso@mit.edu> | 1999-10-26 02:50:36 +0000 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 1999-10-26 02:50:36 +0000 |
commit | 6c979d5c376a864f1216731dbe165237a923c5f7 (patch) | |
tree | 2bab97863fefd5cc11c54384d692cf34bc2da0a9 /lib/uuid/gen_uuid_nt.c | |
parent | 00ab0435078fb0263075ea49144833033922c8a3 (diff) | |
download | e2fsprogs-6c979d5c376a864f1216731dbe165237a923c5f7.tar.gz |
ChangeLog, gen_uuid_nt.c:
gen_uuid_nt.c (uuid_generate): W2K strikes again! An incompatible
interface change means we need to detect whether the code is running
on an NT4 or NT5 system.
config.h, ChangeLog:
config.h: Add #define's for strcasecmp and strncasecmp
Diffstat (limited to 'lib/uuid/gen_uuid_nt.c')
-rw-r--r-- | lib/uuid/gen_uuid_nt.c | 81 |
1 files changed, 74 insertions, 7 deletions
diff --git a/lib/uuid/gen_uuid_nt.c b/lib/uuid/gen_uuid_nt.c index 56aeecbc..aa44bfd3 100644 --- a/lib/uuid/gen_uuid_nt.c +++ b/lib/uuid/gen_uuid_nt.c @@ -1,16 +1,35 @@ - - -// -// Use NT api to generate uuid -// - +/* + * gen_uuid_nt.c -- Use NT api to generate uuid + * + * Written by Andrey Shedel (andreys@ns.cr.cyco.com) + */ #include "uuidP.h" +#pragma warning(push,4) #pragma comment(lib, "ntdll.lib") +// +// Here is a nice example why it's not a good idea +// to use native API in ordinary applications. +// Number of parameters in function below was changed from 3 to 4 +// for NT5. +// +// +// NTSYSAPI +// NTSTATUS +// NTAPI +// NtAllocateUuids( +// OUT PULONG p1, +// OUT PULONG p2, +// OUT PULONG p3, +// OUT PUCHAR Seed // 6 bytes +// ); +// +// + unsigned long __stdcall NtAllocateUuids( @@ -19,7 +38,55 @@ NtAllocateUuids( void* p3 // 4 bytes ); +typedef +unsigned long +(__stdcall* +NtAllocateUuids_2000)( + void* p1, // 8 bytes + void* p2, // 4 bytes + void* p3, // 4 bytes + void* seed // 6 bytes + ); + + + +// +// Nice, but instead of including ntddk.h ot winnt.h +// I should define it here because they MISSED __stdcall in those headers. +// + +__declspec(dllimport) +struct _TEB* +__stdcall +NtCurrentTeb(void); + + +// +// The only way to get version information from the system is to examine +// one stored in PEB. But it's pretty dangerouse because this value could +// be altered in image header. +// + +static +int +Nt5(void) +{ + //return NtCuttentTeb()->Peb->OSMajorVersion >= 5; + return (int)*(int*)((char*)(int)(*(int*)((char*)NtCurrentTeb() + 0x30)) + 0xA4) >= 5; +} + + + + void uuid_generate(uuid_t out) { - NtAllocateUuids(out, ((char*)out)+8, ((char*)out)+12 ); + if(Nt5()) + { + unsigned char seed[6]; + ((NtAllocateUuids_2000)NtAllocateUuids)(out, ((char*)out)+8, ((char*)out)+12, &seed[0] ); + } + else + { + NtAllocateUuids(out, ((char*)out)+8, ((char*)out)+12); + } } |