Define for default parameter string.
[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     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     TCHAR *function_name;\r
31 #ifdef UNICODE\r
32     size_t buflen;\r
33     mbstowcs_s(&buflen, NULL, 0, function, _TRUNCATE);\r
34     function_name = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, buflen * sizeof(TCHAR));\r
35     if (function_name) mbstowcs_s(&buflen, function_name, buflen * sizeof(TCHAR), function, _TRUNCATE);\r
36 #else\r
37     function_name = (TCHAR *) function;\r
38 #endif\r
39     if (*error != ERROR_PROC_NOT_FOUND) log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_GETPROCADDRESS_FAILED, function_name, error_string(*error), 0);\r
40 #ifdef UNICODE\r
41     if (function_name) HeapFree(GetProcessHeap(), 0, function_name);\r
42 #endif\r
43   }\r
44 \r
45   return ret;\r
46 }\r
47 \r
48 int get_imports() {\r
49   unsigned long error;\r
50 \r
51   ZeroMemory(&imports, sizeof(imports));\r
52 \r
53   imports.kernel32 = get_dll(_T("kernel32.dll"), &error);\r
54   if (imports.kernel32) {\r
55     imports.AttachConsole = (AttachConsole_ptr) get_import(imports.kernel32, "AttachConsole", &error);\r
56     if (! imports.AttachConsole) {\r
57       if (error != ERROR_PROC_NOT_FOUND) return 2;\r
58     }\r
59 \r
60     imports.SleepConditionVariableCS = (SleepConditionVariableCS_ptr) get_import(imports.kernel32, "SleepConditionVariableCS", &error);\r
61     if (! imports.SleepConditionVariableCS) {\r
62       if (error != ERROR_PROC_NOT_FOUND) return 3;\r
63     }\r
64 \r
65     imports.WakeConditionVariable = (WakeConditionVariable_ptr) get_import(imports.kernel32, "WakeConditionVariable", &error);\r
66     if (! imports.WakeConditionVariable) {\r
67       if (error != ERROR_PROC_NOT_FOUND) return 4;\r
68     }\r
69   }\r
70   else if (error != ERROR_MOD_NOT_FOUND) return 1;\r
71 \r
72   imports.advapi32 = get_dll(_T("advapi32.dll"), &error);\r
73   if (imports.advapi32) {\r
74     imports.CreateWellKnownSid = (CreateWellKnownSid_ptr) get_import(imports.advapi32, "CreateWellKnownSid", &error);\r
75     if (! imports.CreateWellKnownSid) {\r
76       if (error != ERROR_PROC_NOT_FOUND) return 6;\r
77     }\r
78     imports.IsWellKnownSid = (IsWellKnownSid_ptr) get_import(imports.advapi32, "IsWellKnownSid", &error);\r
79     if (! imports.IsWellKnownSid) {\r
80       if (error != ERROR_PROC_NOT_FOUND) return 7;\r
81     }\r
82   }\r
83   else if (error != ERROR_MOD_NOT_FOUND) return 5;\r
84 \r
85   return 0;\r
86 }\r
87 \r
88 void free_imports() {\r
89   if (imports.kernel32) FreeLibrary(imports.kernel32);\r
90   if (imports.advapi32) FreeLibrary(imports.advapi32);\r
91   ZeroMemory(&imports, sizeof(imports));\r
92 }\r