|
|
/**********************************************************************/ /** 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]; static CONST CHAR VxDPathString[] = "\\\\.\\"; static CONST CHAR VxDExtString[] = ".VXD"; CONST SIZE_T Remaining = sizeof( VxdPath ) - sizeof( VxDPathString ) - sizeof( VxDExtString ) + 1;
//
// Sanity check.
//
DLL_ASSERT( VxdName != NULL ); DLL_ASSERT( VxdId != 0 ); if ( strlen( VxdName ) >= Remaining ) return 0;
//
// Build the VxD path.
//
strcpy( VxdPath, VxDPathString); 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, VxDExtString ); 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
|