94 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * 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 dangerous 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);
 | |
| 	}
 | |
| }
 |