////////////////////////////////////////////////////////////////////////// // // 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 ////////////////////////////////////////////////////////////////////