diff options
Diffstat (limited to 'contrib/uuid/gen_uuid_nt.c')
-rw-r--r-- | contrib/uuid/gen_uuid_nt.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/contrib/uuid/gen_uuid_nt.c b/contrib/uuid/gen_uuid_nt.c new file mode 100644 index 00000000000..aa44bfd3d7d --- /dev/null +++ b/contrib/uuid/gen_uuid_nt.c @@ -0,0 +1,92 @@ +/* + * 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( + void* p1, // 8 bytes + void* p2, // 4 bytes + 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) +{ + 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); + } +} |