119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * gen_uuid_nt.c -- Use NT api to generate uuid 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Written by Andrey Shedel (andreys@ns.cr.cyco.com) 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "uuidP.h" 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#pragma warning(push,4) 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#pragma comment(lib, "ntdll.lib") 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// Here is a nice example why it's not a good idea 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// to use native API in ordinary applications. 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// Number of parameters in function below was changed from 3 to 4 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// for NT5. 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// NTSYSAPI 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// NTSTATUS 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// NTAPI 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// NtAllocateUuids( 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// OUT PULONG p1, 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// OUT PULONG p2, 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// OUT PULONG p3, 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// OUT PUCHAR Seed // 6 bytes 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// ); 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectunsigned long 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project__stdcall 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectNtAllocateUuids( 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void* p1, // 8 bytes 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void* p2, // 4 bytes 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void* p3 // 4 bytes 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ); 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttypedef 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectunsigned long 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project(__stdcall* 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectNtAllocateUuids_2000)( 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void* p1, // 8 bytes 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void* p2, // 4 bytes 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void* p3, // 4 bytes 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void* seed // 6 bytes 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ); 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// Nice, but instead of including ntddk.h ot winnt.h 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// I should define it here because they MISSED __stdcall in those headers. 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project__declspec(dllimport) 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct _TEB* 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project__stdcall 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectNtCurrentTeb(void); 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// The only way to get version information from the system is to examine 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// one stored in PEB. But it's pretty dangerouse because this value could 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// be altered in image header. 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectNt5(void) 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project //return NtCuttentTeb()->Peb->OSMajorVersion >= 5; 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return (int)*(int*)((char*)(int)(*(int*)((char*)NtCurrentTeb() + 0x30)) + 0xA4) >= 5; 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid uuid_generate(uuid_t out) 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if(Nt5()) 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned char seed[6]; 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ((NtAllocateUuids_2000)NtAllocateUuids)(out, ((char*)out)+8, ((char*)out)+12, &seed[0] ); 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project NtAllocateUuids(out, ((char*)out)+8, ((char*)out)+12); 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 93