ReactOS  0.4.14-dev-41-g31d7680
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 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
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.
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);
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 }
WSADATA WSAData
Definition: wintirpc.c:31
#define TRUE
Definition: types.h:120
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:247
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
Definition: thread.c:1264
#define DLL_THREAD_ATTACH
Definition: compat.h:121
INT WSAAPI WSACleanup(VOID)
Definition: startup.c:60
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
GLuint buffer
Definition: glext.h:5915
#define DLL_PROCESS_ATTACH
Definition: compat.h:120
static int init
Definition: wintirpc.c:33
#define DLL_THREAD_DETACH
Definition: compat.h:122
CHAR * LPTSTR
Definition: xmlstorage.h:192
static IN DWORD IN LPVOID lpvReserved
int tirpc_exit(void)
Definition: wintirpc.c:170
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
Definition: wintirpc.c:96
#define va_end(ap)
Definition: acmsvcex.h:90
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:119
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:2631
#define WINAPI
Definition: msvc.h:8
void wintirpc_debug(char *fmt,...)
Definition: wintirpc.c:179
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:3716
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:3711
#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
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)