xref: /netbsd-src/external/gpl3/gcc.old/dist/libphobos/src/std/internal/windows/advapi32.d (revision 627f7eb200a4419d89b531d55fccd2ee3ffdcde0)
1*627f7eb2Smrg // Written in the D programming language.
2*627f7eb2Smrg 
3*627f7eb2Smrg /**
4*627f7eb2Smrg  * The only purpose of this module is to do the static construction for
5*627f7eb2Smrg  * std.windows.registry, to eliminate cyclic construction errors.
6*627f7eb2Smrg  *
7*627f7eb2Smrg  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
8*627f7eb2Smrg  * Authors:   Kenji Hara
9*627f7eb2Smrg  * Source:    $(PHOBOSSRC std/internal/windows/_advapi32.d)
10*627f7eb2Smrg  */
11*627f7eb2Smrg module std.internal.windows.advapi32;
12*627f7eb2Smrg 
13*627f7eb2Smrg version (Windows):
14*627f7eb2Smrg 
15*627f7eb2Smrg import core.sys.windows.windows;
16*627f7eb2Smrg 
17*627f7eb2Smrg pragma(lib, "advapi32.lib");
18*627f7eb2Smrg 
19*627f7eb2Smrg immutable bool isWow64;
20*627f7eb2Smrg 
this()21*627f7eb2Smrg shared static this()
22*627f7eb2Smrg {
23*627f7eb2Smrg     // WOW64 is the x86 emulator that allows 32-bit Windows-based applications to run seamlessly on 64-bit Windows
24*627f7eb2Smrg     // IsWow64Process Function - Minimum supported client - Windows Vista, Windows XP with SP2
25*627f7eb2Smrg     alias fptr_t = extern(Windows) BOOL function(HANDLE, PBOOL);
26*627f7eb2Smrg     auto hKernel = GetModuleHandleA("kernel32");
27*627f7eb2Smrg     auto IsWow64Process = cast(fptr_t) GetProcAddress(hKernel, "IsWow64Process");
28*627f7eb2Smrg     BOOL bIsWow64;
29*627f7eb2Smrg     isWow64 = IsWow64Process && IsWow64Process(GetCurrentProcess(), &bIsWow64) && bIsWow64;
30*627f7eb2Smrg }
31*627f7eb2Smrg 
32*627f7eb2Smrg HMODULE hAdvapi32 = null;
33*627f7eb2Smrg extern (Windows)
34*627f7eb2Smrg {
35*627f7eb2Smrg     LONG function(in HKEY hkey, in LPCWSTR lpSubKey, in REGSAM samDesired, in DWORD reserved) pRegDeleteKeyExW;
36*627f7eb2Smrg }
37*627f7eb2Smrg 
loadAdvapi32()38*627f7eb2Smrg void loadAdvapi32()
39*627f7eb2Smrg {
40*627f7eb2Smrg     if (!hAdvapi32)
41*627f7eb2Smrg     {
42*627f7eb2Smrg         hAdvapi32 = LoadLibraryA("Advapi32.dll");
43*627f7eb2Smrg         if (!hAdvapi32)
44*627f7eb2Smrg             throw new Exception(`LoadLibraryA("Advapi32.dll")`);
45*627f7eb2Smrg 
46*627f7eb2Smrg         pRegDeleteKeyExW = cast(typeof(pRegDeleteKeyExW)) GetProcAddress(hAdvapi32 , "RegDeleteKeyExW");
47*627f7eb2Smrg         if (!pRegDeleteKeyExW)
48*627f7eb2Smrg             throw new Exception(`GetProcAddress(hAdvapi32 , "RegDeleteKeyExW")`);
49*627f7eb2Smrg     }
50*627f7eb2Smrg }
51*627f7eb2Smrg 
52*627f7eb2Smrg // It will free Advapi32.dll, which may be loaded for RegDeleteKeyEx function
freeAdvapi32()53*627f7eb2Smrg private void freeAdvapi32()
54*627f7eb2Smrg {
55*627f7eb2Smrg     if (hAdvapi32)
56*627f7eb2Smrg     {
57*627f7eb2Smrg         if (!FreeLibrary(hAdvapi32))
58*627f7eb2Smrg             throw new Exception(`FreeLibrary("Advapi32.dll")`);
59*627f7eb2Smrg         hAdvapi32 = null;
60*627f7eb2Smrg 
61*627f7eb2Smrg         pRegDeleteKeyExW = null;
62*627f7eb2Smrg     }
63*627f7eb2Smrg }
64*627f7eb2Smrg 
~this()65*627f7eb2Smrg static ~this()
66*627f7eb2Smrg {
67*627f7eb2Smrg     freeAdvapi32();
68*627f7eb2Smrg }
69