Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

339 lines
5.7 KiB

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
apc.c
Abstract:
This module implements the APC helper functions for the WinSock 2.0
helper library.
Author:
Keith Moore (keithmo) 20-Jun-1995
Revision History:
--*/
#include "precomp.h"
//
// Private constants.
//
#define FAKE_HELPER_HANDLE ((HANDLE)'MKC ')
//
// Public functions.
//
DWORD
WINAPI
WahOpenApcHelper(
OUT LPHANDLE HelperHandle
)
/*++
Routine Description:
This routine opens the WinSock 2.0 APC helper device.
Arguments:
HelperHandle - Points to a HANDLE that will receive an open handle
to the APC helper device.
Return Value:
DWORD - NO_ERROR if successful, a Win32 error code if not.
--*/
{
//
// Validate parameters.
//
if( HelperHandle == NULL ) {
return ERROR_INVALID_PARAMETER;
}
//
// Just return a fake handle.
//
*HelperHandle = FAKE_HELPER_HANDLE;
return NO_ERROR;
} // WahOpenApcHelper
DWORD
WINAPI
WahCloseApcHelper(
IN HANDLE HelperHandle
)
/*++
Routine Description:
This function closes the WinSock 2.0 APC helper device.
Arguments:
HelperHandle - The handle to close.
Return Value:
DWORD - NO_ERROR if successful, a Win32 error code if not.
--*/
{
//
// Validate parameters.
//
if( HelperHandle != FAKE_HELPER_HANDLE ) {
return ERROR_INVALID_PARAMETER;
}
//
// Nothing to do.
//
return NO_ERROR;
} // WahCloseApcHelper
DWORD
WINAPI
WahOpenCurrentThread(
IN HANDLE HelperHandle,
OUT LPWSATHREADID ThreadId
)
/*++
Routine Description:
This function opens a handle to the current thread.
Arguments:
HelperHandle - An open handle to the APC helper device.
ThreadId - Points to a WSATHREADID structure that will receive
an open handle to the current thread and an (optional) OS-
dependent thread identifier.
Return Value:
DWORD - NO_ERROR if successful, a Win32 error code if not.
--*/
{
HANDLE currentProcess;
HANDLE currentThread;
//
// Validate parameters.
//
if( ( HelperHandle != FAKE_HELPER_HANDLE ) ||
( ThreadId == NULL ) ) {
return ERROR_INVALID_PARAMETER;
}
//
// Grab the current process & thread handles.
//
currentProcess = GetCurrentProcess();
currentThread = GetCurrentThread();
//
// Duplicate the current thread pseudo handle.
//
if( DuplicateHandle(
currentProcess, // hSourceProcessHandle
currentThread, // hSourceHandle
currentProcess, // hTargetProcessHandle
&ThreadId->ThreadHandle, // lpTargetHandle
0, // dwDesiredAttributes
FALSE, // bInheritHandle
DUPLICATE_SAME_ACCESS // dwOptions
) ) {
//
// The NT implementation of the APC helper does not really
// need the OS-dependent thread identifier, but we'll store
// the current thread ID in the structure just for completeness.
//
ThreadId->Reserved = (DWORD)currentThread;
return NO_ERROR;
}
return GetLastError();
} // WahOpenCurrentThread
DWORD
WINAPI
WahCloseThread(
IN HANDLE HelperHandle,
IN LPWSATHREADID ThreadId
)
/*++
Routine Description:
This routine closes an open thread handle.
Arguments:
HelperHandle - An open handle to the APC helper device.
ThreadId - Points to a WSATHREADID structure initialized by a
previous call to WahOpenCurrentThread().
Return Value:
DWORD - NO_ERROR if successful, a Win32 error code if not.
--*/
{
//
// Validate parameters.
//
if( ( HelperHandle != FAKE_HELPER_HANDLE ) ||
( ThreadId == NULL ) ||
( ThreadId->ThreadHandle == NULL ) ) {
return ERROR_INVALID_PARAMETER;
}
//
// Close the handle.
//
if( CloseHandle( ThreadId->ThreadHandle ) ) {
//
// Clear the fields in case the client tries something stupid.
//
ThreadId->ThreadHandle = NULL;
ThreadId->Reserved = 0;
return NO_ERROR;
}
return GetLastError();
} // WahCloseThread
DWORD
WINAPI
WahQueueUserApc(
IN HANDLE HelperHandle,
IN LPWSATHREADID ThreadId,
IN LPWSAUSERAPC ApcRoutine,
IN DWORD ApcContext OPTIONAL
)
/*++
Routine Description:
This routine queues a user-mode APC for the specified thread.
Arguments:
HelperHandle - An open handle to the APC helper device.
ThreadId - Points to a WSATHREADID structure initialized by a
previous call to WahOpenCurrentThread().
ApcRoutine - Points to the APC code to execute when the specified
thread enters an alertable wait.
ApcContext - An uninterpreted context value to pass to the APC routine.
Return Value:
DWORD - NO_ERROR if successful, a Win32 error code if not.
--*/
{
//
// Validate parameters.
//
if( ( HelperHandle != FAKE_HELPER_HANDLE ) ||
( ThreadId == NULL ) ||
( ThreadId->ThreadHandle == NULL ) ||
( ApcRoutine == NULL ) ) {
return ERROR_INVALID_PARAMETER;
}
//
// Queue the APC.
//
if( QueueUserAPC(
(PAPCFUNC)ApcRoutine, // pfnAPC
ThreadId->ThreadHandle, // hThread
ApcContext // dwData
) ) {
//
// Success.
//
return NO_ERROR;
}
return GetLastError();
} // WahQueueUserApc