245 lines
5 KiB
C++
245 lines
5 KiB
C++
|
/**********************************************************************/
|
||
|
/** Microsoft Windows **/
|
||
|
/** Copyright(c) Microsoft Corp., 1993 **/
|
||
|
/**********************************************************************/
|
||
|
|
||
|
/*
|
||
|
vxd32.c
|
||
|
|
||
|
This module contains the Win32-dependent VxD interface.
|
||
|
|
||
|
The following functions are exported by this module:
|
||
|
|
||
|
OsOpenVxdHandle
|
||
|
OsCloseVxdHandle
|
||
|
OsSubmitVxdRequest
|
||
|
|
||
|
|
||
|
FILE HISTORY:
|
||
|
KeithMo 16-Jan-1994 Created.
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Private constants.
|
||
|
//
|
||
|
|
||
|
#define DLL_ASSERT ASSERT
|
||
|
|
||
|
|
||
|
//
|
||
|
// Private types.
|
||
|
//
|
||
|
|
||
|
|
||
|
//
|
||
|
// Private globals.
|
||
|
//
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
|
||
|
DWORD LastVxdOpcode;
|
||
|
LPVOID LastVxdParam;
|
||
|
DWORD LastVxdParamLength;
|
||
|
|
||
|
#endif // DEBUG
|
||
|
|
||
|
|
||
|
//
|
||
|
// Private prototypes.
|
||
|
//
|
||
|
|
||
|
|
||
|
//
|
||
|
// Public functions.
|
||
|
//
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: OsOpenVxdHandle
|
||
|
|
||
|
SYNOPSIS: Opens a handle to the specified VxD.
|
||
|
|
||
|
ENTRY: VxdName - The ASCII name of the target VxD.
|
||
|
|
||
|
VxdId - The unique ID of the target VxD.
|
||
|
|
||
|
RETURNS: DWORD - A handle to the target VxD if successful,
|
||
|
0 if not.
|
||
|
|
||
|
HISTORY:
|
||
|
KeithMo 16-Jan-1994 Created.
|
||
|
DavidKa 18-Apr-1994 Dynamic load.
|
||
|
|
||
|
********************************************************************/
|
||
|
DWORD
|
||
|
OsOpenVxdHandle(
|
||
|
CHAR* VxdName,
|
||
|
WORD VxdId
|
||
|
)
|
||
|
{
|
||
|
HANDLE VxdHandle;
|
||
|
CHAR VxdPath[MAX_PATH];
|
||
|
|
||
|
//
|
||
|
// Sanity check.
|
||
|
//
|
||
|
|
||
|
DLL_ASSERT( VxdName != NULL );
|
||
|
DLL_ASSERT( VxdId != 0 );
|
||
|
|
||
|
|
||
|
//
|
||
|
// Build the VxD path.
|
||
|
//
|
||
|
|
||
|
strcpy( VxdPath, "\\\\.\\");
|
||
|
strcat( VxdPath, VxdName);
|
||
|
|
||
|
//
|
||
|
// Open the device.
|
||
|
//
|
||
|
// First try the name without the .VXD extension. This will
|
||
|
// cause CreateFile to connect with the VxD if it is already
|
||
|
// loaded (CreateFile will not load the VxD in this case).
|
||
|
//
|
||
|
|
||
|
VxdHandle = CreateFileA( VxdPath,
|
||
|
GENERIC_READ | GENERIC_WRITE,
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
|
NULL,
|
||
|
OPEN_EXISTING,
|
||
|
FILE_FLAG_DELETE_ON_CLOSE,
|
||
|
NULL );
|
||
|
|
||
|
if( VxdHandle == INVALID_HANDLE_VALUE )
|
||
|
{
|
||
|
//
|
||
|
// Not found. Append the .VXD extension and try again.
|
||
|
// This will cause CreateFile to load the VxD.
|
||
|
//
|
||
|
|
||
|
strcat( VxdPath, ".VXD" );
|
||
|
VxdHandle = CreateFileA( VxdPath,
|
||
|
GENERIC_READ | GENERIC_WRITE,
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
|
NULL,
|
||
|
OPEN_EXISTING,
|
||
|
FILE_FLAG_DELETE_ON_CLOSE,
|
||
|
NULL );
|
||
|
}
|
||
|
|
||
|
if( VxdHandle != INVALID_HANDLE_VALUE )
|
||
|
{
|
||
|
return (DWORD)VxdHandle;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
} // OsOpenVxdHandle
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: OsCloseVxdHandle
|
||
|
|
||
|
SYNOPSIS: Closes an open VxD handle.
|
||
|
|
||
|
ENTRY: VxdHandle - The open VxD handle to close.
|
||
|
|
||
|
HISTORY:
|
||
|
KeithMo 16-Jan-1994 Created.
|
||
|
|
||
|
********************************************************************/
|
||
|
VOID
|
||
|
OsCloseVxdHandle(
|
||
|
DWORD VxdHandle
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// Sanity check.
|
||
|
//
|
||
|
|
||
|
DLL_ASSERT( VxdHandle != 0 );
|
||
|
|
||
|
CloseHandle( (HANDLE)VxdHandle );
|
||
|
|
||
|
} // OsCloseVxdHandle
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: OsSubmitVxdRequest
|
||
|
|
||
|
SYNOPSIS: Submits a request to the specified VxD.
|
||
|
|
||
|
ENTRY: VxdHandle - An open VxD handle.
|
||
|
|
||
|
OpCode - Specifies the operation to perform.
|
||
|
|
||
|
Param - Points to operation-specific parameters.
|
||
|
|
||
|
ParamLength - The size (in BYTEs) of *Param.
|
||
|
|
||
|
RETURNS: INT - Result code. 0 if successful, !0 if not.
|
||
|
|
||
|
HISTORY:
|
||
|
KeithMo 16-Jan-1994 Created.
|
||
|
|
||
|
********************************************************************/
|
||
|
INT
|
||
|
OsSubmitVxdRequest(
|
||
|
DWORD VxdHandle,
|
||
|
INT OpCode,
|
||
|
LPVOID Param,
|
||
|
INT ParamLength
|
||
|
)
|
||
|
{
|
||
|
DWORD BytesRead;
|
||
|
INT Result = 0;
|
||
|
|
||
|
//
|
||
|
// Sanity check.
|
||
|
//
|
||
|
|
||
|
DLL_ASSERT( VxdHandle != 0 );
|
||
|
DLL_ASSERT( ( Param != NULL ) || ( ParamLength == 0 ) );
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
|
||
|
LastVxdOpcode = (DWORD)OpCode;
|
||
|
LastVxdParam = Param;
|
||
|
LastVxdParamLength = (DWORD)ParamLength;
|
||
|
|
||
|
#endif // DEBUG
|
||
|
|
||
|
//
|
||
|
// Just do it.
|
||
|
//
|
||
|
|
||
|
if( !DeviceIoControl( (HANDLE)VxdHandle,
|
||
|
OpCode,
|
||
|
Param,
|
||
|
ParamLength,
|
||
|
Param,
|
||
|
ParamLength,
|
||
|
&BytesRead,
|
||
|
NULL ) )
|
||
|
{
|
||
|
Result = GetLastError();
|
||
|
}
|
||
|
|
||
|
return Result;
|
||
|
|
||
|
} // OsSubmitVxdRequest
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|