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