Use close_handle().
[nssm.git] / imports.cpp
1 #include "nssm.h"\r
2 \r
3 imports_t imports;\r
4 \r
5 /*\r
6   Try to set up function pointers.\r
7   In this first implementation it is not an error if we can't load them\r
8   because we aren't currently trying to load any functions which we\r
9   absolutely need.  If we later add some indispensible imports we can\r
10   return non-zero here to force an application exit.\r
11 */\r
12 HMODULE get_dll(const TCHAR *dll, unsigned long *error) {\r
13   *error = 0;\r
14 \r
15   HMODULE ret = LoadLibrary(dll);\r
16   if (! ret) {\r
17     *error = GetLastError();\r
18     if (*error != ERROR_PROC_NOT_FOUND) log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_LOADLIBRARY_FAILED, dll, error_string(*error), 0);\r
19   }\r
20 \r
21   return ret;\r
22 }\r
23 \r
24 FARPROC get_import(HMODULE library, const char *function, unsigned long *error) {\r
25   *error = 0;\r
26 \r
27   FARPROC ret = GetProcAddress(library, function);\r
28   if (! ret) {\r
29     *error = GetLastError();\r
30     if (*error != ERROR_PROC_NOT_FOUND) {\r
31       TCHAR *function_name;\r
32       if (! from_utf8(function, &function_name, 0)) {\r
33         log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_GETPROCADDRESS_FAILED, function_name, error_string(*error), 0);\r
34         HeapFree(GetProcessHeap(), 0, function_name);\r
35       }\r
36     }\r
37   }\r
38 \r
39   return ret;\r
40 }\r
41 \r
42 int get_imports() {\r
43   unsigned long error;\r
44 \r
45   ZeroMemory(&imports, sizeof(imports));\r
46 \r
47   imports.kernel32 = get_dll(_T("kernel32.dll"), &error);\r
48   if (imports.kernel32) {\r
49     imports.AttachConsole = (AttachConsole_ptr) get_import(imports.kernel32, "AttachConsole", &error);\r
50     if (! imports.AttachConsole) {\r
51       if (error != ERROR_PROC_NOT_FOUND) return 2;\r
52     }\r
53 \r
54     imports.QueryFullProcessImageName = (QueryFullProcessImageName_ptr) get_import(imports.kernel32, QUERYFULLPROCESSIMAGENAME_EXPORT, &error);\r
55     if (! imports.QueryFullProcessImageName) {\r
56       if (error != ERROR_PROC_NOT_FOUND) return 3;\r
57     }\r
58 \r
59     imports.SleepConditionVariableCS = (SleepConditionVariableCS_ptr) get_import(imports.kernel32, "SleepConditionVariableCS", &error);\r
60     if (! imports.SleepConditionVariableCS) {\r
61       if (error != ERROR_PROC_NOT_FOUND) return 4;\r
62     }\r
63 \r
64     imports.WakeConditionVariable = (WakeConditionVariable_ptr) get_import(imports.kernel32, "WakeConditionVariable", &error);\r
65     if (! imports.WakeConditionVariable) {\r
66       if (error != ERROR_PROC_NOT_FOUND) return 5;\r
67     }\r
68   }\r
69   else if (error != ERROR_MOD_NOT_FOUND) return 1;\r
70 \r
71   imports.advapi32 = get_dll(_T("advapi32.dll"), &error);\r
72   if (imports.advapi32) {\r
73     imports.CreateWellKnownSid = (CreateWellKnownSid_ptr) get_import(imports.advapi32, "CreateWellKnownSid", &error);\r
74     if (! imports.CreateWellKnownSid) {\r
75       if (error != ERROR_PROC_NOT_FOUND) return 7;\r
76     }\r
77     imports.IsWellKnownSid = (IsWellKnownSid_ptr) get_import(imports.advapi32, "IsWellKnownSid", &error);\r
78     if (! imports.IsWellKnownSid) {\r
79       if (error != ERROR_PROC_NOT_FOUND) return 8;\r
80     }\r
81   }\r
82   else if (error != ERROR_MOD_NOT_FOUND) return 6;\r
83 \r
84   return 0;\r
85 }\r
86 \r
87 void free_imports() {\r
88   if (imports.kernel32) FreeLibrary(imports.kernel32);\r
89   if (imports.advapi32) FreeLibrary(imports.advapi32);\r
90   ZeroMemory(&imports, sizeof(imports));\r
91 }\r