Whamcloud - gitweb
e4crypt: remove unneeded stat(2) call in do_get_policy()
[tools/e2fsprogs.git] / lib / uuid / gen_uuid_nt.c
1 /*
2  * gen_uuid_nt.c -- Use NT api to generate uuid
3  *
4  * Written by Andrey Shedel (andreys@ns.cr.cyco.com)
5  */
6
7
8 #include "config.h"
9 #include "uuidP.h"
10
11 #pragma warning(push,4)
12
13 #pragma comment(lib, "ntdll.lib")
14
15 //
16 // Here is a nice example why it's not a good idea
17 // to use native API in ordinary applications.
18 // Number of parameters in function below was changed from 3 to 4
19 // for NT5.
20 //
21 //
22 // NTSYSAPI
23 // NTSTATUS
24 // NTAPI
25 // NtAllocateUuids(
26 //     OUT PULONG p1,
27 //     OUT PULONG p2,
28 //     OUT PULONG p3,
29 //     OUT PUCHAR Seed // 6 bytes
30 //   );
31 //
32 //
33
34 unsigned long
35 __stdcall
36 NtAllocateUuids(
37    void* p1,  // 8 bytes
38    void* p2,  // 4 bytes
39    void* p3   // 4 bytes
40    );
41
42 typedef
43 unsigned long
44 (__stdcall*
45 NtAllocateUuids_2000)(
46    void* p1,  // 8 bytes
47    void* p2,  // 4 bytes
48    void* p3,  // 4 bytes
49    void* seed // 6 bytes
50    );
51
52
53
54 //
55 // Nice, but instead of including ntddk.h ot winnt.h
56 // I should define it here because they MISSED __stdcall in those headers.
57 //
58
59 __declspec(dllimport)
60 struct _TEB*
61 __stdcall
62 NtCurrentTeb(void);
63
64
65 //
66 // The only way to get version information from the system is to examine
67 // one stored in PEB. But it's pretty dangerous because this value could
68 // be altered in image header.
69 //
70
71 static
72 int
73 Nt5(void)
74 {
75         //return NtCuttentTeb()->Peb->OSMajorVersion >= 5;
76         return (int)*(int*)((char*)(int)(*(int*)((char*)NtCurrentTeb() + 0x30)) + 0xA4) >= 5;
77 }
78
79
80
81
82 void uuid_generate(uuid_t out)
83 {
84         if(Nt5())
85         {
86                 unsigned char seed[6];
87                 ((NtAllocateUuids_2000)NtAllocateUuids)(out, ((char*)out)+8, ((char*)out)+12, &seed[0] );
88         }
89         else
90         {
91                 NtAllocateUuids(out, ((char*)out)+8, ((char*)out)+12);
92         }
93 }