mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
9393fc320e
Excluded: 3rd-party code (incl. wine) and most of the win32ss.
152 lines
3.7 KiB
C
152 lines
3.7 KiB
C
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS WinSock 2 DLL
|
|
* FILE: dll/win32/ws2help/apc.c
|
|
* PURPOSE: WinSock 2 DLL header
|
|
*/
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
#include "precomp.h"
|
|
|
|
/* DATA **********************************************************************/
|
|
|
|
#define APCH (HANDLE)'SOR '
|
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
DWORD
|
|
WINAPI
|
|
WahOpenApcHelper(OUT PHANDLE ApcHelperHandle)
|
|
{
|
|
DWORD ErrorCode;
|
|
|
|
/* Enter the prolog, make sure we're initialized */
|
|
ErrorCode = WS2HELP_PROLOG();
|
|
if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
|
|
|
|
/* Validate handle */
|
|
if (!ApcHelperHandle) return ERROR_INVALID_PARAMETER;
|
|
|
|
/*
|
|
* Return a bogus handle ("ROS")
|
|
* Historical note:(MS sends "CKM", which probably stands for "Keith Moore"
|
|
* (KM), one of the core architects of Winsock 2.2 from Microsoft.
|
|
*/
|
|
*ApcHelperHandle = APCH;
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
WahCloseApcHelper(IN HANDLE ApcHelperHandle)
|
|
{
|
|
DWORD ErrorCode;
|
|
|
|
/* Enter the prolog, make sure we're initialized */
|
|
ErrorCode = WS2HELP_PROLOG();
|
|
if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
|
|
|
|
/* Validate handle */
|
|
if (ApcHelperHandle != APCH) return ERROR_INVALID_PARAMETER;
|
|
|
|
/* return */
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
WahCloseThread(IN HANDLE ApcHelperHandle,
|
|
IN LPWSATHREADID ThreadId)
|
|
{
|
|
DWORD ErrorCode;
|
|
|
|
/* Enter the prolog, make sure we're initialized */
|
|
ErrorCode = WS2HELP_PROLOG();
|
|
if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
|
|
|
|
/* Validate handles */
|
|
if ((ApcHelperHandle != APCH) || (!ThreadId) || (!ThreadId->ThreadHandle))
|
|
{
|
|
/* Invalid helper/thread handles */
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
/* Close the thread handle */
|
|
if (CloseHandle(ThreadId->ThreadHandle))
|
|
{
|
|
/* Clear the structure */
|
|
ThreadId->ThreadHandle = NULL;
|
|
ThreadId->Reserved = 0;
|
|
return NO_ERROR;
|
|
}
|
|
|
|
/* return */
|
|
return GetLastError();
|
|
}
|
|
|
|
INT
|
|
WINAPI
|
|
WahQueueUserApc(IN HANDLE ApcHelperHandle,
|
|
IN LPWSATHREADID ThreadId,
|
|
IN LPWSAUSERAPC ApcRoutine,
|
|
IN PVOID ApcContext OPTIONAL)
|
|
{
|
|
/* Validate params */
|
|
if ((ApcHelperHandle != APCH) ||
|
|
(!ThreadId) ||
|
|
(!ThreadId->ThreadHandle) ||
|
|
(!ApcRoutine))
|
|
{
|
|
/* Invalid parameters */
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
/* Queue the APC */
|
|
if (QueueUserAPC(ApcRoutine, ThreadId->ThreadHandle, (ULONG_PTR)ApcContext))
|
|
{
|
|
/* Return success */
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
/* Fail */
|
|
return GetLastError();
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
WahOpenCurrentThread(IN HANDLE ApcHelperHandle,
|
|
OUT LPWSATHREADID ThreadId)
|
|
{
|
|
HANDLE ProcessHandle, ThreadHandle;
|
|
|
|
/* Validate params */
|
|
if ((ApcHelperHandle != APCH) || (!ThreadId))
|
|
{
|
|
/* Invalid parameters */
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
/* Get the process/thread handles */
|
|
ProcessHandle = GetCurrentProcess();
|
|
ThreadHandle = GetCurrentThread();
|
|
|
|
/* Duplicate the handle */
|
|
if (DuplicateHandle(ProcessHandle,
|
|
ThreadHandle,
|
|
ProcessHandle,
|
|
&ThreadId->ThreadHandle,
|
|
0,
|
|
FALSE,
|
|
DUPLICATE_SAME_ACCESS))
|
|
{
|
|
/* Save the thread handle and return */
|
|
ThreadId->Reserved = (DWORD_PTR)ThreadHandle;
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
/* Fail */
|
|
return GetLastError();
|
|
}
|
|
|
|
/* EOF */
|