windows-nt/Source/XPSP1/NT/shell/ext/hnw/nconn32/vxd32.cpp

245 lines
5 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/**********************************************************************/
/** 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