ReactOS  0.4.15-dev-1197-g8081ba9
wintirpc.c
Go to the documentation of this file.
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 
32 
33 static int init = 0;
35 
36 extern void multithread_init(void);
37 
38 VOID
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 
75 }
76 
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 
91 {
92  WSACleanup();
93  return TRUE;
94 }
95 
96 #ifdef __REACTOS__
97 char NETCONFIG[MAX_PATH] = "";
98 #endif
99 BOOL WINAPI DllMain/*tirpc_main*/(HINSTANCE hinstDLL, // DLL module handle
100  DWORD fdwReason, // reason called
101  LPVOID lpvReserved) // reserved
102 {
103  LPVOID lpvData;
104  BOOL fIgnore;
105 
106 // if (init++)
107 // return TRUE;
108 
109  // Deal with Thread Local Storage initialization!!
110  switch (fdwReason)
111  {
112  // The DLL is loading due to process
113  // initialization or a call to LoadLibrary.
114  case DLL_PROCESS_ATTACH:
115 #ifdef __REACTOS__
117  return FALSE;
118 
119  lstrcatA(NETCONFIG, "\\drivers\\etc\\netconfig");
120 #endif
121 
122  // Initialize socket library
123  if (winsock_init() == FALSE)
124  return FALSE;
125 
126  // Initialize CriticalSections
128 
129  // Allocate a TLS index.
130  if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
131  return FALSE;
132 
133  // No break: Initialize the index for first thread.
134 
135  // The attached process creates a new thread.
136  case DLL_THREAD_ATTACH:
137 
138  // Initialize the TLS index for this thread
139  lpvData = (LPVOID) LocalAlloc(LPTR, 256);
140  if (lpvData != NULL)
141  fIgnore = TlsSetValue(dwTlsIndex, lpvData);
142 
143  break;
144 
145  // The thread of the attached process terminates.
146  case DLL_THREAD_DETACH:
147 
148  // Release the allocated memory for this thread.
149  lpvData = TlsGetValue(dwTlsIndex);
150  if (lpvData != NULL)
151  LocalFree((HLOCAL) lpvData);
152 
153  break;
154 
155  // DLL unload due to process termination or FreeLibrary.
156  case DLL_PROCESS_DETACH:
157 
158  // Release the allocated memory for this thread.
159  lpvData = TlsGetValue(dwTlsIndex);
160  if (lpvData != NULL)
161  LocalFree((HLOCAL) lpvData);
162 
163  // Release the TLS index.
165 
166  // Clean up winsock stuff
167  winsock_fini();
168 
169  break;
170 
171  default:
172  break;
173  }
174 
175 
176  return TRUE;
177 }
178 
179 int tirpc_exit(void)
180 {
181  if (init == 0 || --init > 0)
182  return 0;
183 
184  return WSACleanup();
185 }
186 
187 
188 void wintirpc_debug(char *fmt, ...)
189 {
190 #ifdef _DEBUG
191  char buffer[2048];
192 #else
193  static int triedToOpen = 0;
194  static FILE *dbgFile = NULL;
195 #endif
196 
197  va_list vargs;
198  va_start(vargs, fmt);
199 
200 #ifdef _DEBUG
201  vsprintf(buffer, fmt, vargs);
203 #else
204  if (dbgFile == NULL && triedToOpen == 0) {
205  triedToOpen = 1;
206  dbgFile = fopen("c:\\etc\\rpcsec_gss_debug.txt", "w");
207  }
208  if (dbgFile != NULL) {
209  vfprintf(dbgFile, fmt, vargs);
210  fflush(dbgFile);
211  }
212 #endif
213 
214  va_end(vargs);
215 }
WSADATA WSAData
Definition: wintirpc.c:31
void tirpc_criticalsection_init(void)
Definition: wintirpc.c:73
BOOL winsock_fini(void)
Definition: wintirpc.c:90
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define MAKEWORD(a, b)
Definition: typedefs.h:248
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
Definition: thread.c:1264
#define TRUE
Definition: types.h:120
#define DLL_THREAD_ATTACH
Definition: compat.h:132
INT WSAAPI WSACleanup(VOID)
Definition: startup.c:60
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2282
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1044
GLuint buffer
Definition: glext.h:5915
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
static int init
Definition: wintirpc.c:33
#define DLL_THREAD_DETACH
Definition: compat.h:133
CHAR * LPTSTR
Definition: xmlstorage.h:192
static IN DWORD IN LPVOID lpvReserved
int tirpc_exit(void)
Definition: wintirpc.c:179
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
Definition: wintirpc.c:99
#define va_end(ap)
Definition: acmsvcex.h:90
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
int _snwprintf(wchar_t *buffer, size_t count, const wchar_t *format,...)
smooth NULL
Definition: ftsmooth.c:416
char * va_list
Definition: acmsvcex.h:78
#define DLL_PROCESS_DETACH
Definition: compat.h:130
LPSTR WINAPI lstrcatA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:123
BOOL WINAPI TlsFree(IN DWORD Index)
Definition: thread.c:1154
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define EVENTLOG_WARNING_TYPE
Definition: winnt_old.h:2702
#define MAX_PATH
Definition: compat.h:34
#define WINAPI
Definition: msvc.h:6
void wintirpc_debug(char *fmt,...)
Definition: wintirpc.c:188
unsigned long DWORD
Definition: ntddk_ex.h:95
#define LPVOID
Definition: nt_native.h:45
static const WCHAR L[]
Definition: oid.c:1250
#define VOID
Definition: acefi.h:82
#define ReportEvent
Definition: winbase.h:3739
DWORD WINAPI TlsAlloc(VOID)
Definition: thread.c:1088
#define TLS_OUT_OF_INDEXES
Definition: winbase.h:530
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
#define err(...)
#define RegisterEventSource
Definition: winbase.h:3734
#define TEXT(s)
Definition: k32.h:26
static DWORD dwTlsIndex
Definition: wintirpc.c:34
_Check_return_opt_ _CRTIMP int __cdecl fflush(_Inout_opt_ FILE *_File)
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1577
int __cdecl vsprintf(char *_Dest, const char *_Format, va_list _Args)
Definition: sprintf.c:733
#define va_start(ap, A)
Definition: acmsvcex.h:91
BOOL WINAPI DeregisterEventSource(IN HANDLE hEventLog)
Definition: eventlog.c:473
#define NETCONFIG
Definition: netconfig.h:11
LPVOID WINAPI TlsGetValue(IN DWORD Index)
Definition: thread.c:1228
#define LPTR
Definition: winbase.h:362
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1373
BOOL winsock_init(void)
Definition: wintirpc.c:77
VOID tirpc_report(LPTSTR lpszMsg)
Definition: wintirpc.c:39
_Check_return_opt_ _CRTIMP int __cdecl vfprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
Definition: dsound.c:943
void WINAPI SHIM_OBJ_NAME() OutputDebugStringA(LPCSTR lpOutputString)
Definition: ignoredbgout.c:18
void multithread_init(void)