1 /* NFSv4.1 client for Windows 2 * Copyright � 2012 The Regents of the University of Michigan 3 * 4 * Olga Kornievskaia <aglo@umich.edu> 5 * Casey Bodley <cbodley@umich.edu> 6 * 7 * This library is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU Lesser General Public License as published by 9 * the Free Software Foundation; either version 2.1 of the License, or (at 10 * your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, but 13 * without any warranty; without even the implied warranty of merchantability 14 * or fitness for a particular purpose. See the GNU Lesser General Public 15 * License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public License 18 * along with this library; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20 */ 21 22 #include <wintirpc.h> 23 #include <rpc/rpc.h> 24 #include <stdio.h> 25 #ifndef __REACTOS__ 26 #include <winsock.h> 27 #else 28 #include <winsock2.h> 29 #endif 30 31 WSADATA WSAData; 32 33 static int init = 0; 34 static DWORD dwTlsIndex; 35 36 extern void multithread_init(void); 37 38 VOID 39 tirpc_report(LPTSTR lpszMsg) 40 { 41 WCHAR chMsg[256]; 42 HANDLE hEventSource; 43 LPCWSTR lpszStrings[2]; 44 45 // Use event logging to log the error. 46 // 47 hEventSource = RegisterEventSource(NULL, 48 TEXT("tirpc.dll")); 49 50 #ifndef __REACTOS__ 51 swprintf_s(chMsg, sizeof(chMsg), L"tirpc report: %d", GetLastError()); 52 #else 53 _snwprintf(chMsg, sizeof(chMsg) / sizeof(WCHAR), L"tirpc report: %d", GetLastError()); 54 #endif 55 lpszStrings[0] = (LPCWSTR)chMsg; 56 lpszStrings[1] = lpszMsg; 57 58 if (hEventSource != NULL) { 59 ReportEvent(hEventSource, // handle of event source 60 EVENTLOG_WARNING_TYPE, // event type 61 0, // event category 62 0, // event ID 63 NULL, // current user's SID 64 2, // strings in lpszStrings 65 0, // no bytes of raw data 66 lpszStrings, // array of error strings 67 NULL); // no raw data 68 69 (VOID) DeregisterEventSource(hEventSource); 70 } 71 } 72 73 void tirpc_criticalsection_init(void) { 74 multithread_init(); 75 } 76 77 BOOL winsock_init(void) 78 { 79 int err; 80 err = WSAStartup(MAKEWORD( 3, 3 ), &WSAData); // XXX THIS SHOULD BE FAILING!!!!!!!!!!!!!!!!! 81 if (err != 0) { 82 init = 0; 83 tirpc_report(L"WSAStartup failed!\n"); 84 WSACleanup(); 85 return FALSE; 86 } 87 return TRUE; 88 } 89 90 BOOL winsock_fini(void) 91 { 92 WSACleanup(); 93 return TRUE; 94 } 95 96 BOOL WINAPI DllMain/*tirpc_main*/(HINSTANCE hinstDLL, // DLL module handle 97 DWORD fdwReason, // reason called 98 LPVOID lpvReserved) // reserved 99 { 100 LPVOID lpvData; 101 BOOL fIgnore; 102 103 // if (init++) 104 // return TRUE; 105 106 // Deal with Thread Local Storage initialization!! 107 switch (fdwReason) 108 { 109 // The DLL is loading due to process 110 // initialization or a call to LoadLibrary. 111 case DLL_PROCESS_ATTACH: 112 113 // Initialize socket library 114 if (winsock_init() == FALSE) 115 return FALSE; 116 117 // Initialize CriticalSections 118 tirpc_criticalsection_init(); 119 120 // Allocate a TLS index. 121 if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) 122 return FALSE; 123 124 // No break: Initialize the index for first thread. 125 126 // The attached process creates a new thread. 127 case DLL_THREAD_ATTACH: 128 129 // Initialize the TLS index for this thread 130 lpvData = (LPVOID) LocalAlloc(LPTR, 256); 131 if (lpvData != NULL) 132 fIgnore = TlsSetValue(dwTlsIndex, lpvData); 133 134 break; 135 136 // The thread of the attached process terminates. 137 case DLL_THREAD_DETACH: 138 139 // Release the allocated memory for this thread. 140 lpvData = TlsGetValue(dwTlsIndex); 141 if (lpvData != NULL) 142 LocalFree((HLOCAL) lpvData); 143 144 break; 145 146 // DLL unload due to process termination or FreeLibrary. 147 case DLL_PROCESS_DETACH: 148 149 // Release the allocated memory for this thread. 150 lpvData = TlsGetValue(dwTlsIndex); 151 if (lpvData != NULL) 152 LocalFree((HLOCAL) lpvData); 153 154 // Release the TLS index. 155 TlsFree(dwTlsIndex); 156 157 // Clean up winsock stuff 158 winsock_fini(); 159 160 break; 161 162 default: 163 break; 164 } 165 166 167 return TRUE; 168 } 169 170 int tirpc_exit(void) 171 { 172 if (init == 0 || --init > 0) 173 return 0; 174 175 return WSACleanup(); 176 } 177 178 179 void wintirpc_debug(char *fmt, ...) 180 { 181 #ifdef _DEBUG 182 char buffer[2048]; 183 #else 184 static int triedToOpen = 0; 185 static FILE *dbgFile = NULL; 186 #endif 187 188 va_list vargs; 189 va_start(vargs, fmt); 190 191 #ifdef _DEBUG 192 vsprintf(buffer, fmt, vargs); 193 OutputDebugStringA(buffer); 194 #else 195 if (dbgFile == NULL && triedToOpen == 0) { 196 triedToOpen = 1; 197 dbgFile = fopen("c:\\etc\\rpcsec_gss_debug.txt", "w"); 198 } 199 if (dbgFile != NULL) { 200 vfprintf(dbgFile, fmt, vargs); 201 fflush(dbgFile); 202 } 203 #endif 204 205 va_end(vargs); 206 } 207