1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock 2 DLL
4 * FILE: dll/win32/ws2help/apc.c
5 * PURPOSE: WinSock 2 DLL header
6 */
7
8 /* INCLUDES ******************************************************************/
9
10 #include "precomp.h"
11
12 /* DATA **********************************************************************/
13
14 #define APCH (HANDLE)'SOR '
15
16 /* FUNCTIONS *****************************************************************/
17
18 DWORD
19 WINAPI
WahOpenApcHelper(OUT PHANDLE ApcHelperHandle)20 WahOpenApcHelper(OUT PHANDLE ApcHelperHandle)
21 {
22 DWORD ErrorCode;
23
24 /* Enter the prolog, make sure we're initialized */
25 ErrorCode = WS2HELP_PROLOG();
26 if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
27
28 /* Validate handle */
29 if (!ApcHelperHandle) return ERROR_INVALID_PARAMETER;
30
31 /*
32 * Return a bogus handle ("ROS")
33 * Historical note:(MS sends "CKM", which probably stands for "Keith Moore"
34 * (KM), one of the core architects of Winsock 2.2 from Microsoft.
35 */
36 *ApcHelperHandle = APCH;
37 return ERROR_SUCCESS;
38 }
39
40 DWORD
41 WINAPI
WahCloseApcHelper(IN HANDLE ApcHelperHandle)42 WahCloseApcHelper(IN HANDLE ApcHelperHandle)
43 {
44 DWORD ErrorCode;
45
46 /* Enter the prolog, make sure we're initialized */
47 ErrorCode = WS2HELP_PROLOG();
48 if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
49
50 /* Validate handle */
51 if (ApcHelperHandle != APCH) return ERROR_INVALID_PARAMETER;
52
53 /* return */
54 return ERROR_SUCCESS;
55 }
56
57 DWORD
58 WINAPI
WahCloseThread(IN HANDLE ApcHelperHandle,IN LPWSATHREADID ThreadId)59 WahCloseThread(IN HANDLE ApcHelperHandle,
60 IN LPWSATHREADID ThreadId)
61 {
62 DWORD ErrorCode;
63
64 /* Enter the prolog, make sure we're initialized */
65 ErrorCode = WS2HELP_PROLOG();
66 if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
67
68 /* Validate handles */
69 if ((ApcHelperHandle != APCH) || (!ThreadId) || (!ThreadId->ThreadHandle))
70 {
71 /* Invalid helper/thread handles */
72 return ERROR_INVALID_PARAMETER;
73 }
74
75 /* Close the thread handle */
76 if (CloseHandle(ThreadId->ThreadHandle))
77 {
78 /* Clear the structure */
79 ThreadId->ThreadHandle = NULL;
80 ThreadId->Reserved = 0;
81 return NO_ERROR;
82 }
83
84 /* return */
85 return GetLastError();
86 }
87
88 INT
89 WINAPI
WahQueueUserApc(IN HANDLE ApcHelperHandle,IN LPWSATHREADID ThreadId,IN LPWSAUSERAPC ApcRoutine,IN PVOID ApcContext OPTIONAL)90 WahQueueUserApc(IN HANDLE ApcHelperHandle,
91 IN LPWSATHREADID ThreadId,
92 IN LPWSAUSERAPC ApcRoutine,
93 IN PVOID ApcContext OPTIONAL)
94 {
95 /* Validate params */
96 if ((ApcHelperHandle != APCH) ||
97 (!ThreadId) ||
98 (!ThreadId->ThreadHandle) ||
99 (!ApcRoutine))
100 {
101 /* Invalid parameters */
102 return ERROR_INVALID_PARAMETER;
103 }
104
105 /* Queue the APC */
106 if (QueueUserAPC(ApcRoutine, ThreadId->ThreadHandle, (ULONG_PTR)ApcContext))
107 {
108 /* Return success */
109 return ERROR_SUCCESS;
110 }
111
112 /* Fail */
113 return GetLastError();
114 }
115
116 DWORD
117 WINAPI
WahOpenCurrentThread(IN HANDLE ApcHelperHandle,OUT LPWSATHREADID ThreadId)118 WahOpenCurrentThread(IN HANDLE ApcHelperHandle,
119 OUT LPWSATHREADID ThreadId)
120 {
121 HANDLE ProcessHandle, ThreadHandle;
122
123 /* Validate params */
124 if ((ApcHelperHandle != APCH) || (!ThreadId))
125 {
126 /* Invalid parameters */
127 return ERROR_INVALID_PARAMETER;
128 }
129
130 /* Get the process/thread handles */
131 ProcessHandle = GetCurrentProcess();
132 ThreadHandle = GetCurrentThread();
133
134 /* Duplicate the handle */
135 if (DuplicateHandle(ProcessHandle,
136 ThreadHandle,
137 ProcessHandle,
138 &ThreadId->ThreadHandle,
139 0,
140 FALSE,
141 DUPLICATE_SAME_ACCESS))
142 {
143 /* Save the thread handle and return */
144 ThreadId->Reserved = (DWORD_PTR)ThreadHandle;
145 return ERROR_SUCCESS;
146 }
147
148 /* Fail */
149 return GetLastError();
150 }
151
152 /* EOF */
153