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