| /* |
| * gen_uuid_nt.c -- Use NT api to generate uuid |
| * |
| * Written by Andrey Shedel (andreys@ns.cr.cyco.com) |
| */ |
| |
| |
| #include "config.h" |
| #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); |
| } |
| } |