486 lines
12 KiB
C++
486 lines
12 KiB
C++
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Copyright (c) 2001 Microsoft Corporation
|
||
|
//
|
||
|
// Module Name:
|
||
|
// open.cpp
|
||
|
//
|
||
|
// Abstract:
|
||
|
// This module contains functions associated with enumerating,
|
||
|
// opening, and closing the tdi device objects
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// private prototype
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
VOID
|
||
|
StringToUcntString(
|
||
|
PUCNTSTRING pusDestination,
|
||
|
TCHAR *sSource
|
||
|
);
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// Public functions
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DoGetNumDevices
|
||
|
//
|
||
|
// Arguments: ulAddressType -- address type to scan list for
|
||
|
//
|
||
|
// Returns: number of devices found
|
||
|
//
|
||
|
// Descript: This function gets the number of openable devices
|
||
|
// of this address type registered with tdisample.sys
|
||
|
//
|
||
|
//---------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
ULONG
|
||
|
DoGetNumDevices(ULONG ulAddressType)
|
||
|
{
|
||
|
RECEIVE_BUFFER ReceiveBuffer; // return info from command
|
||
|
SEND_BUFFER SendBuffer; // arguments for command
|
||
|
|
||
|
//
|
||
|
// set up arguments
|
||
|
//
|
||
|
SendBuffer.COMMAND_ARGS.GetDevArgs.ulAddressType = ulAddressType;
|
||
|
|
||
|
//
|
||
|
// call driver to execute command, and deal with results
|
||
|
//
|
||
|
if (TdiLibDeviceIO(ulGETNUMDEVICES,
|
||
|
&SendBuffer,
|
||
|
&ReceiveBuffer) == STATUS_SUCCESS)
|
||
|
{
|
||
|
return ReceiveBuffer.RESULTS.ulReturnValue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DoGetDeviceName
|
||
|
//
|
||
|
// Arguments: addresstype -- address type to get
|
||
|
// slotnum -- which device to get of that type
|
||
|
// pName -- buffer large enough to hold name
|
||
|
// (supplied by caller)
|
||
|
//
|
||
|
// Returns: status of command
|
||
|
//
|
||
|
// Descript: This function gets the n'th device from the list of devices
|
||
|
// of this address type registered with tdisample.sys
|
||
|
//
|
||
|
//---------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
DoGetDeviceName(ULONG ulAddressType,
|
||
|
ULONG ulSlotNum,
|
||
|
TCHAR *pName) // buffer from caller!!
|
||
|
{
|
||
|
NTSTATUS lStatus; // status of command
|
||
|
RECEIVE_BUFFER ReceiveBuffer; // return info from command
|
||
|
SEND_BUFFER SendBuffer; // arguments for command
|
||
|
|
||
|
//
|
||
|
// set up arguments
|
||
|
//
|
||
|
SendBuffer.COMMAND_ARGS.GetDevArgs.ulAddressType = ulAddressType;
|
||
|
SendBuffer.COMMAND_ARGS.GetDevArgs.ulSlotNum = ulSlotNum;
|
||
|
|
||
|
//
|
||
|
// call the driver
|
||
|
//
|
||
|
lStatus = TdiLibDeviceIO(ulGETDEVICE,
|
||
|
&SendBuffer,
|
||
|
&ReceiveBuffer);
|
||
|
|
||
|
//
|
||
|
// deal with results
|
||
|
//
|
||
|
if (lStatus == STATUS_SUCCESS)
|
||
|
{
|
||
|
WCHAR *pSourceTemp = ReceiveBuffer.RESULTS.ucsStringReturn.wcBuffer;
|
||
|
for(;;)
|
||
|
{
|
||
|
*pName = (TCHAR)*pSourceTemp++;
|
||
|
if (*pName == 0)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
pName++;
|
||
|
}
|
||
|
}
|
||
|
return lStatus;
|
||
|
}
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DoGetAddress
|
||
|
//
|
||
|
// Arguments: addresstype -- address type to get
|
||
|
// slotnum -- which device to get
|
||
|
// pTransAddr -- transport address (allocated by calleer,
|
||
|
// filled by this function)
|
||
|
//
|
||
|
// Returns: status of command
|
||
|
// if successful, pTransAddr is filled
|
||
|
//
|
||
|
// Descript: This function gets the address of the n'th device from the
|
||
|
// list of devices registered with tdisample.sys
|
||
|
//
|
||
|
//---------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
DoGetAddress(ULONG ulAddressType,
|
||
|
ULONG ulSlotNum,
|
||
|
PTRANSPORT_ADDRESS pTransAddr)
|
||
|
{
|
||
|
NTSTATUS lStatus; // status of command
|
||
|
RECEIVE_BUFFER ReceiveBuffer; // return info from command
|
||
|
SEND_BUFFER SendBuffer; // arguments for command
|
||
|
|
||
|
//
|
||
|
// set up arguments
|
||
|
//
|
||
|
SendBuffer.COMMAND_ARGS.GetDevArgs.ulAddressType = ulAddressType;
|
||
|
SendBuffer.COMMAND_ARGS.GetDevArgs.ulSlotNum = ulSlotNum;
|
||
|
|
||
|
//
|
||
|
// call the driver
|
||
|
//
|
||
|
lStatus = TdiLibDeviceIO(ulGETADDRESS,
|
||
|
&SendBuffer,
|
||
|
&ReceiveBuffer);
|
||
|
|
||
|
//
|
||
|
// deal with the results
|
||
|
//
|
||
|
if (lStatus == STATUS_SUCCESS)
|
||
|
{
|
||
|
PTRANSPORT_ADDRESS pTransportAddress
|
||
|
= (PTRANSPORT_ADDRESS)&ReceiveBuffer.RESULTS.TransAddr;
|
||
|
ULONG ulLength
|
||
|
= FIELD_OFFSET(TRANSPORT_ADDRESS, Address)
|
||
|
+ FIELD_OFFSET(TA_ADDRESS, Address)
|
||
|
+ pTransportAddress->Address[0].AddressLength;
|
||
|
|
||
|
|
||
|
memcpy(pTransAddr,
|
||
|
pTransportAddress,
|
||
|
ulLength);
|
||
|
}
|
||
|
|
||
|
return lStatus;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
// ------------------------------------------
|
||
|
//
|
||
|
// Function: DoOpenControl
|
||
|
//
|
||
|
// Arguments: strDeviceName -- device name to open
|
||
|
//
|
||
|
// Returns: TdiHandle (ULONG) if successful; 0 if failure
|
||
|
//
|
||
|
// Descript: calls the driver to open control channel
|
||
|
//
|
||
|
// ------------------------------------------
|
||
|
|
||
|
TDIHANDLE
|
||
|
DoOpenControl(TCHAR *strDeviceName)
|
||
|
{
|
||
|
RECEIVE_BUFFER ReceiveBuffer; // return info from command
|
||
|
SEND_BUFFER SendBuffer; // arguments for command
|
||
|
|
||
|
//
|
||
|
// set up the arguments
|
||
|
//
|
||
|
StringToUcntString(&SendBuffer.COMMAND_ARGS.OpenArgs.ucsDeviceName,
|
||
|
strDeviceName);
|
||
|
|
||
|
//
|
||
|
// call the driver
|
||
|
//
|
||
|
if (TdiLibDeviceIO(ulOPENCONTROL,
|
||
|
&SendBuffer,
|
||
|
&ReceiveBuffer) == STATUS_SUCCESS)
|
||
|
{
|
||
|
return ReceiveBuffer.RESULTS.TdiHandle;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DoCloseControl
|
||
|
//
|
||
|
// Argument: ulTdiHandle -- handle for control channel
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Descript: This function closes the indicated control channel
|
||
|
//
|
||
|
//-------------------------------------------------------------
|
||
|
|
||
|
VOID
|
||
|
DoCloseControl(ULONG ulTdiHandle)
|
||
|
{
|
||
|
RECEIVE_BUFFER ReceiveBuffer; // return info from command
|
||
|
SEND_BUFFER SendBuffer; // arguments for command
|
||
|
|
||
|
//
|
||
|
// set up the arguments
|
||
|
//
|
||
|
SendBuffer.TdiHandle = ulTdiHandle;
|
||
|
|
||
|
//
|
||
|
// call the driver
|
||
|
//
|
||
|
NTSTATUS lStatus = TdiLibDeviceIO(ulCLOSECONTROL,
|
||
|
&SendBuffer,
|
||
|
&ReceiveBuffer);
|
||
|
|
||
|
if (lStatus != STATUS_SUCCESS)
|
||
|
{
|
||
|
_tprintf(TEXT("DoCloseControl: failure, status = %s\n"), TdiLibStatusMessage(lStatus));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// ------------------------------------------
|
||
|
//
|
||
|
// Function: DoOpenAddress
|
||
|
//
|
||
|
// Arguments: strDeviceName -- device name to open
|
||
|
// pTransportAddress -- address to open
|
||
|
// pulTdiHandle -- returned handle if successful
|
||
|
//
|
||
|
// Returns: status of command
|
||
|
//
|
||
|
// Descript: calls the driver to open address object
|
||
|
//
|
||
|
// ------------------------------------------
|
||
|
|
||
|
TDIHANDLE
|
||
|
DoOpenAddress(TCHAR *strDeviceName,
|
||
|
PTRANSPORT_ADDRESS pTransportAddress)
|
||
|
{
|
||
|
RECEIVE_BUFFER ReceiveBuffer; // return info from command
|
||
|
SEND_BUFFER SendBuffer; // arguments for command
|
||
|
|
||
|
//
|
||
|
// set up arguments
|
||
|
//
|
||
|
StringToUcntString(&SendBuffer.COMMAND_ARGS.OpenArgs.ucsDeviceName,
|
||
|
strDeviceName);
|
||
|
|
||
|
memcpy(&SendBuffer.COMMAND_ARGS.OpenArgs.TransAddr,
|
||
|
pTransportAddress,
|
||
|
(FIELD_OFFSET(TRANSPORT_ADDRESS, Address)
|
||
|
+ FIELD_OFFSET(TA_ADDRESS, Address)
|
||
|
+ pTransportAddress->Address[0].AddressLength));
|
||
|
|
||
|
//
|
||
|
// call the driver
|
||
|
//
|
||
|
if (TdiLibDeviceIO(ulOPENADDRESS,
|
||
|
&SendBuffer,
|
||
|
&ReceiveBuffer) == STATUS_SUCCESS)
|
||
|
{
|
||
|
return ReceiveBuffer.RESULTS.TdiHandle;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DoCloseAddress
|
||
|
//
|
||
|
// Argument: ulTdiHandle -- handle for address object
|
||
|
//
|
||
|
// Returns: None
|
||
|
//
|
||
|
// Descript: This function closes the indicated address object
|
||
|
//
|
||
|
//-------------------------------------------------------------
|
||
|
|
||
|
VOID
|
||
|
DoCloseAddress(ULONG ulTdiHandle)
|
||
|
{
|
||
|
RECEIVE_BUFFER ReceiveBuffer; // return info from command
|
||
|
SEND_BUFFER SendBuffer; // arguments for command
|
||
|
|
||
|
//
|
||
|
// set up arguments
|
||
|
//
|
||
|
SendBuffer.TdiHandle = ulTdiHandle;
|
||
|
|
||
|
//
|
||
|
// call the driver
|
||
|
//
|
||
|
NTSTATUS lStatus = TdiLibDeviceIO(ulCLOSEADDRESS,
|
||
|
&SendBuffer,
|
||
|
&ReceiveBuffer);
|
||
|
|
||
|
if (lStatus != STATUS_SUCCESS)
|
||
|
{
|
||
|
_tprintf(TEXT("DoCloseAddress: failure, status = %s\n"), TdiLibStatusMessage(lStatus));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// ------------------------------------------
|
||
|
//
|
||
|
// Function: DoOpenEndpoint
|
||
|
//
|
||
|
// Arguments: strDeviceName -- device name to open
|
||
|
// pTransportAddress -- address to open
|
||
|
// pulTdiHandle -- returned handled (if successful)
|
||
|
//
|
||
|
// Returns: status of command
|
||
|
//
|
||
|
// Descript: calls the driver to open endpoint object
|
||
|
//
|
||
|
// ------------------------------------------
|
||
|
|
||
|
TDIHANDLE
|
||
|
DoOpenEndpoint(TCHAR *strDeviceName,
|
||
|
PTRANSPORT_ADDRESS pTransportAddress)
|
||
|
|
||
|
{
|
||
|
RECEIVE_BUFFER ReceiveBuffer; // return info from command
|
||
|
SEND_BUFFER SendBuffer; // arguments for command
|
||
|
|
||
|
//
|
||
|
// set up the arguments
|
||
|
//
|
||
|
StringToUcntString(&SendBuffer.COMMAND_ARGS.OpenArgs.ucsDeviceName,
|
||
|
strDeviceName);
|
||
|
|
||
|
memcpy(&SendBuffer.COMMAND_ARGS.OpenArgs.TransAddr,
|
||
|
pTransportAddress,
|
||
|
(FIELD_OFFSET(TRANSPORT_ADDRESS, Address)
|
||
|
+ FIELD_OFFSET(TA_ADDRESS, Address)
|
||
|
+ pTransportAddress->Address[0].AddressLength));
|
||
|
|
||
|
//
|
||
|
// call the driver
|
||
|
//
|
||
|
if (TdiLibDeviceIO(ulOPENENDPOINT,
|
||
|
&SendBuffer,
|
||
|
&ReceiveBuffer) == STATUS_SUCCESS)
|
||
|
{
|
||
|
return ReceiveBuffer.RESULTS.TdiHandle;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DoCloseEndpoint
|
||
|
//
|
||
|
// Argument: pTdiHandle -- handle for endpoint object
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Descript: This function closes the indicated endpoint object
|
||
|
//
|
||
|
//-------------------------------------------------------------
|
||
|
|
||
|
VOID
|
||
|
DoCloseEndpoint(ULONG ulTdiHandle)
|
||
|
{
|
||
|
RECEIVE_BUFFER ReceiveBuffer; // return info from command
|
||
|
SEND_BUFFER SendBuffer; // arguments for command
|
||
|
|
||
|
//
|
||
|
// set up arguments
|
||
|
//
|
||
|
SendBuffer.TdiHandle = ulTdiHandle;
|
||
|
|
||
|
//
|
||
|
// call the driver
|
||
|
//
|
||
|
NTSTATUS lStatus = TdiLibDeviceIO(ulCLOSEENDPOINT,
|
||
|
&SendBuffer,
|
||
|
&ReceiveBuffer);
|
||
|
|
||
|
if (lStatus != STATUS_SUCCESS)
|
||
|
{
|
||
|
_tprintf(TEXT("DoCloseEndpoint: failure, status = %s\n"), TdiLibStatusMessage(lStatus));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////
|
||
|
// private functions
|
||
|
///////////////////////////////////////////
|
||
|
|
||
|
|
||
|
// -------------------------------
|
||
|
//
|
||
|
// Function: StringToUcntString
|
||
|
//
|
||
|
// Arguments: pusDestination -- counted wide string
|
||
|
// pcSource -- asci string
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Descript: copies ansi (ascii) string to counted wide string
|
||
|
//
|
||
|
// -------------------------------
|
||
|
|
||
|
VOID
|
||
|
StringToUcntString(PUCNTSTRING pusDestination,
|
||
|
TCHAR *Source)
|
||
|
{
|
||
|
PWCHAR pwcString // ptr to data of wide string
|
||
|
= pusDestination->wcBuffer;
|
||
|
ULONG ulLength = _tcslen(Source);
|
||
|
|
||
|
for(ULONG ulCount = 0; ulCount < ulLength; ulCount++)
|
||
|
{
|
||
|
*pwcString++ = Source[ulCount];
|
||
|
}
|
||
|
*pwcString = 0;
|
||
|
pusDestination->usLength = (USHORT)(ulLength * 2);
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////
|
||
|
// end of file open.cpp
|
||
|
////////////////////////////////////////////////////////////////////
|
||
|
|