www.pudn.com > usb2303.rar > Test_usb2303.cpp
// Test_usb2303.cpp // // Generated by DriverWizard version DriverStudio 3.1.0 (Build 1722) // // This console application demonstrates how to open a handle // to a device in your driver, and communicate with the driver // using Read, Write, and DeviceIoControl calls, as appropriate. // // This test program attempts to open the device using the // GUID defined in "..\Usb2303Deviceinterface.h" #include#include #include #include #include "..\usb2303ioctl.h" #include "..\Usb2303Deviceinterface.h" // Has class GUID definition // This function is found in module OpenByIntf.cpp HANDLE OpenByInterface(GUID* pClassGuid, DWORD instance, PDWORD pError); typedef void VOIDFUNC(); // Prototypes void Usage(void); void ShowIoctlValues(void); // TODO: // You can redefine the IOCTL handler prototypes as needed, adding // appropriate parameters that can be collected from the command line. // To do this you must modify the command line parsing logic. An // example of this is shown in comments throughout the test application. // //=== Parameterized IOCTL Example === // void Test_IOCTL_PARAMETERIZED(int nVal, ULONG dwVal); void Test_USB2303_IOCTL_Test(void); void CloseIfOpen(void); void doRead(int i); void doWrite(int i); // Global data #define N_IOCODES 1 // Names of IOCTL codes // char *IOnames[N_IOCODES+1] = { //=== Parameterized IOCTL Example === // "IOCTL_PARAMETERIZED", "USB2303_IOCTL_Test", "" }; // IOCTL codes // int IOcodes[N_IOCODES+1] = { //=== Parameterized IOCTL Example === // IOCTL_PARAMETERIZED, USB2303_IOCTL_Test, 0 }; // Handle to device opened in driver. // HANDLE hDevice = INVALID_HANDLE_VALUE; // Class GUID used to open device // GUID ClassGuid = Usb2303Device_CLASS_GUID; //////////////////////////////////////////////////////////////////////// // Exit // // Print a message and exit // void Exit(int res) { printf("Exiting...\n\n"); CloseIfOpen(); exit(res); } //////////////////////////////////////////////////////////////////////// // Main entry point // // int __cdecl main(int argc, char *argv[]) { int nArgIndex; // Walk through command line arguments int nArgIncrement = 0; int val; //=== Parameterized IOCTL Example === // int nVal; // ULONG dwVal; DWORD Error; printf("Test application Test_usb2303 starting...\n"); hDevice = OpenByInterface( &ClassGuid, 0, &Error); if (hDevice == INVALID_HANDLE_VALUE) { printf("ERROR opening device: (%0x) returned from CreateFile\n", GetLastError()); Exit(1); } else { printf("Device found, handle open.\n"); } // Parse the command line if (argc < 2) Usage(); nArgIndex = 1; while (nArgIndex < argc) { // Parse ahead to determine numeric value of argument if (nArgIndex+1 >= argc) Usage(); if (!isdigit(argv[nArgIndex+1][0])) Usage(); val = atoi(argv[nArgIndex+1]); switch (argv[nArgIndex][0]) { case 'r': case 'R': doRead(val); nArgIncrement = 2; break; case 'w': case 'W': doWrite(val); nArgIncrement = 2; break; case 'i': case 'I': if (val >= N_IOCODES) { printf("IO control code index must be less than %d\n", N_IOCODES); ShowIoctlValues(); Exit(1); } switch (IOcodes[val]) { //=== Parameterized IOCTL Example === // case IOCTL_PARAMETERIZED: // if (nArgIndex+3 >= argc) Usage(); // nVal = atoi(argv[nArgIndex+2]); // dwVal = strtoul(argv[nArgIndex+3], NULL, 0); // Test_IOCTL_PARAMETERIZED(nVal, dwVal); // nArgIncrement = 4; // break; case USB2303_IOCTL_Test: Test_USB2303_IOCTL_Test(); nArgIncrement = 2; break; default: printf("IO control code not valid\n"); Exit(1); } break; case '?': case 'h': default: Usage(); } nArgIndex += nArgIncrement; } return 0; } //////////////////////////////////////////////////////////////////////// // CloseIfOpen // // Close the device if we previously opened a handle to it. // void CloseIfOpen(void) { if (hDevice != INVALID_HANDLE_VALUE) { // Close the handle to the driver if (!CloseHandle(hDevice)) { printf("ERROR: CloseHandle returns %0x.\n", GetLastError()); } hDevice = INVALID_HANDLE_VALUE; } } //////////////////////////////////////////////////////////////////////// // doRead // // Read 'n' bytes of data from the device // // Note: This simple test app reads data from the device and displays the // data as characters. This behavior can be modified as appropriate // for your device. // void doRead(int n) { char *buf; ULONG nRead; int i; int j; buf = (char *) malloc(n); if (buf == NULL) { printf("Failed to allocate buffer for read"); Exit(1); } // Read data from driver printf("Reading from device - "); ReadFile(hDevice, buf, n, &nRead, NULL); printf("%d bytes read from device (%d requested).\n", nRead, n); // Print what was read i = 0; while(i < n) { j = min((i+26),n); for(; i < j; i++) { printf("%c, ", buf[i]); } printf("\n"); } free(buf); } //////////////////////////////////////////////////////////////////////// // doWrite // // Write 'n' bytes of data to the device // // Note: This simple test app writes sequential characters to the // device. This behavior can be modified as appropriate // for your device. // void doWrite(int n) { char *buf; ULONG nWritten; int i; int j; buf = (char *) malloc(n); if (buf == NULL) { printf("Failed to allocate buffer for write"); Exit(1); } // start with the mod26 letter of the number of bytes to write j = (n % 26); // load buffer with dummy data (abcdefg...) for (i=0; i \n"); // printf( " Example: i %d \n", i); // } } }