16c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o/* 26c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o * gen_uuid_nt.c -- Use NT api to generate uuid 36c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o * 46c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o * Written by Andrey Shedel (andreys@ns.cr.cyco.com) 56c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o */ 6aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o 7aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o 8aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o#include "uuidP.h" 9aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o 106c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o#pragma warning(push,4) 11aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o 12aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o#pragma comment(lib, "ntdll.lib") 13aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o 146c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// 156c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// Here is a nice example why it's not a good idea 166c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// to use native API in ordinary applications. 176c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// Number of parameters in function below was changed from 3 to 4 186c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// for NT5. 196c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// 206c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// 216c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// NTSYSAPI 226c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// NTSTATUS 236c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// NTAPI 246c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// NtAllocateUuids( 256c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// OUT PULONG p1, 266c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// OUT PULONG p2, 276c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// OUT PULONG p3, 286c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// OUT PUCHAR Seed // 6 bytes 296c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// ); 306c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// 316c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// 326c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 33aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'ounsigned long 34aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o__stdcall 35aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'oNtAllocateUuids( 36aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o void* p1, // 8 bytes 37aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o void* p2, // 4 bytes 38aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o void* p3 // 4 bytes 39aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o ); 40aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o 416c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'otypedef 426c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'ounsigned long 436c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o(__stdcall* 446c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'oNtAllocateUuids_2000)( 456c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o void* p1, // 8 bytes 466c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o void* p2, // 4 bytes 476c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o void* p3, // 4 bytes 486c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o void* seed // 6 bytes 496c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o ); 506c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 516c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 526c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 536c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// 546c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// Nice, but instead of including ntddk.h ot winnt.h 556c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// I should define it here because they MISSED __stdcall in those headers. 566c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// 576c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 586c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o__declspec(dllimport) 596c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'ostruct _TEB* 606c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o__stdcall 616c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'oNtCurrentTeb(void); 626c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 636c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 646c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// 656c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// The only way to get version information from the system is to examine 666c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// one stored in PEB. But it's pretty dangerouse because this value could 676c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// be altered in image header. 686c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o// 696c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 706c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'ostatic 716c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'oint 726c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'oNt5(void) 736c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o{ 746c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o //return NtCuttentTeb()->Peb->OSMajorVersion >= 5; 756c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o return (int)*(int*)((char*)(int)(*(int*)((char*)NtCurrentTeb() + 0x30)) + 0xA4) >= 5; 766c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o} 776c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 786c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 796c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 806c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o 81aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'ovoid uuid_generate(uuid_t out) 82aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o{ 836c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o if(Nt5()) 846c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o { 856c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o unsigned char seed[6]; 866c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o ((NtAllocateUuids_2000)NtAllocateUuids)(out, ((char*)out)+8, ((char*)out)+12, &seed[0] ); 876c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o } 886c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o else 896c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o { 906c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o NtAllocateUuids(out, ((char*)out)+8, ((char*)out)+12); 916c979d5c376a864f1216731dbe165237a923c5f7Theodore Ts'o } 92aa4115a47c554a936fdf5e6679e72a9329fecf45Theodore Ts'o} 93