Copyright © 2003 by Printing Communications Assoc., Inc. (PCAUSA). All rights reserved
After adding the PassThruEx skeleton I/O dispatch handlers (and building a driver with these additions...) it is possible to start developing the Win32 test application. If everything is glued together correctly then we should see this message when we run PTUserIo:
"PassThru Handle Open Successful"
Here are the key functions that are implemented in PTUserIo.cpp at this early stage:
///////////////////////////////////////////////////////////////////////////// //// PtOpenControlChannel // // Purpose // Open a "control channel" handle on the PassThru device. // // Parameters // None. // // Return Value // The INVALIE_HANDLE_VALUE if unsuccessful. Otherwise, a valid handle // to the passthru device. // // Remarks // There are no parameters to this function because the PassThru filespec // name is already known. For PassThru this is "\\.\PassThru" or // "\\.\Global\PassThru" // // This call opens a "control channel". That is, a handle that can be // used for DeviceIoControl calls but is not associated with a specific // adapter. // // Notice that the FILE_FLAG_OVERLAPPED attribute is not specified. The // returned handle is used for synchronous operations only. // // A more sophisticated API would employ asynchronous I/O. However, a // sample of that complexity is beyond the scope of this article. //
HANDLE PtOpenControlChannel( void ) { DWORD DesiredAccess; DWORD ShareMode; LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL;
DWORD CreationDistribution; DWORD FlagsAndAttributes; HANDLE TemplateFile; HANDLE Handle;
// // Use CreateFile to Open the Handle // DesiredAccess = GENERIC_READ|GENERIC_WRITE; ShareMode = 0; CreationDistribution = OPEN_EXISTING; FlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; TemplateFile = (HANDLE)INVALID_HANDLE_VALUE;
Handle = CreateFile( "\\\\.\\PassThru", DesiredAccess, ShareMode, lpSecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile );
if( Handle == INVALID_HANDLE_VALUE ) { // See Microsoft KB Article 259131 Handle = CreateFile( "\\\\.\\Globals\\PassThru", DesiredAccess, ShareMode, lpSecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile ); }
return (Handle); }
///////////////////////////////////////////////////////////////////////////// //// _tmain // // Purpose // PTUserIo MFC console application MAIN entry point. // // Parameters // // Return Value // // Remarks //
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // // Open A Handle On The PassThru Device // HANDLE PtHandle = PtOpenControlChannel();
if( PtHandle == INVALID_HANDLE_VALUE ) { cout << "PassThru Handle Open Failed" << endl;
nRetCode = 1; return nRetCode; }
cout << "PassThru Handle Open Successful" << endl;
CloseHandle( PtHandle );
return nRetCode; }