//////////////////////////////////////////////////////////////////////
// Get buffer size
printf("\nTest %d\n",TestNo++);
ULONG BufferSize;
DWORD BytesReturned;
if (!DeviceIoControl(hWdm1, IOCTL_WDM1_GET_BUFFER_SIZE,
NULL, 0,// Input
&BufferSize, sizeof(ULONG),// Output
&BytesReturned, NULL)) printf("XXX Could not get buffer size\n");
else printf(" Buffer size is %i (%d bytes returned)\n",BufferSize,BytesReturned);
//////////////////////////////////////////////////////////////////////
// Get buffer size
printf("\nTest %d\n",TestNo++);
char* Buffer = new char[BufferSize+1];
if (!DeviceIoControl(hWdm1, IOCTL_WDM1_GET_BUFFER,
NULL, 0,// Input
Buffer, BufferSize,// Output
&BytesReturned, NULL)) printf("XXX Could not get buffer\n");
else printf(" First DWORD of buffer is %08X (%d bytes returned)\n",*((DWORD*)Buffer),Bytes Returned);
///////////////////////////////////////////////////////////////////////
// Get too big a buffer size
printf("\nTest %d\n",TestNo++);
if (!DeviceIoControl(hWdm1, IOCTL_WDM1_GET_BUFFER,
NULL, 0,// Input
Buffer, BufferSize+1,// Output
&BytesReturned, NULL)) printf(" Too big get buffer failed correctly %d\n",GetLastError());
else printf("XXX Too big get buffer unexpectedly succeeded\n");
///////////////////////////////////////////////////////////////////////
// Zero all buffer bytes
printf("\nTest %d\n",TestNo++);
if (!DeviceIoControl(hWdm1, IOCTL_WDM1_ZERO_BUFFER,
NULL, 0,// Input
NULL, 0,// Output
&BytesReturned, NULL)) printf("XXX Zero buffer failed %d\n" ,GetLastError());
else printf(" Zero buffer succeeded\n");
if (!DeviceIoControl(hWdm1, IOCTL_WDM1_GET_BUFFER,
NULL, 0,// Input
Buffer, BufferSize,// Output
&BytesReturned, NULL)) printf("XXX Could not get buffer\n");
else printf(" First DWORD of buffer is %08X (%d bytes returned)\ n",*((DWORD*)Buffer),BytesReturned);
///////////////////////////////////////////////////////////////////////
// Remove buffer
printf("\nTest %d\n",TestNo++);
if (!DeviceIoControl(hWdm1, IOCTL_WDM1_REMOVE_BUFFER,
NULL, 0,// Input
NULL, 0,// Output
&BytesReturned, NULL)) printf("XXX Remove buffer failed %d\n",GetLastError());
else printf(" Remove buffer succeeded\n");
if (!DeviceloControl(hWdm1, IOCTL_WDM1_GET_BUFFER_SIZE,
NULL, 0,// Input
&BufferSize, sizeof(ULONG),// Output
&BytesReturned, NULL)) printf("XXX Could not get buffer size\n");
else printf(" Buffer size is %i (%d bytes returned)\n",BufferSize,BytesReturned);
///////////////////////////////////////////////////////////////////////
// Unrecognised IOCTL
printf("\nTest %d\n",TestNo++);
if (!DeviceIoControl(hWdm1, IOCTL_WDM1_UNRECOGNISED,
NULL, 0,// Input
NULL, 0,1/ Output
&BytesReturned, NULL)) printf(" Unrecognised IOCTL correctly failed %d\n",GetLastError());
else printf("XXX Unrecognised IOCTL unexpectedly succeeded\n");
///////////////////////////////////////////////////////////////////////
// Write 0xabcdef01 to start of buffer
printf("\nTest %d\n",TestNo++);
dwNewPtr = SetFilePointer(hWdm1, 0, NULL, FILE_BEGIN);
if (dwNewPtr==0xFFFFFFFF) printf("XXX SetFilePointer failed %d\n",GetLastError());
else printf(" SetFilePointer worked\n");
Wvalue = 0xabcdef01;
if (!WriteFile(hWdm1, &Wvalue, 4, &TxdBytes, NULL)) printf("XXX Could not write %X\n", Wvalue);
else if( TxdBytes==4) printf(" Write 0xabcdef01 succeeded\n");
else printf("XXX Wrong number of bytes written: %d\n",TxdBytes);
/////////////////////////////////////////////////////////////////////////
// Close device
printf("\nTest %d\n",TestNo++);
if (!CloseHandle(hWdm1)) printf("XXX CloseHandle failed %d\n", GetLastError());
else printf(" CloseHandle worked\n");
/////////////////////////////////////////////////////////////////////////
delete Buffer;
printf("\nPress enter please");
char line[80];
gets(line);
return 0;
}
//////////////////////////////////////////////////////////////////////////
//GetDeviceViaInterface:Open a handle via a device interface
HANDLE GetDeviceViaInterface(GUID* pGuid, DWORD instance) {
// Get handle to relevant device information set
HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if (info==INVALID_HANDLE_VALUE) {
printf("No HDEVINFO available for this GUID\n");
return NULL;
}
// Get interface data for the requested instance
SP_INTERFACE_DEVICE_DATA ifdata;
ifdata.cbSize = sizeof(ifdata);
if (!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, instance, &ifdata)) {
printf("No SP_INTERFACE_DEVICE_DATA available for this GUID instance\n");
SetupDiDestroyDeviceInfoList(info);
return NULL;
}
// Get size of symbolic link name
DWORD ReqLen;
SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL);
PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);
if (ifDetail==NULL) {
SetupDiDestroyDeviceInfoList(info);
return NULL;
}
// Get symbolic link name
ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL)) {
SetupDiDestroyDeviceInfoList(info);
delete ifDetail;
return NULL;
}
printf("Symbolic link is %s\n", ifDetail–>DevicePath);
// Open file
HANDLE rv = CreateFile(ifDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
delete ifDetail;
SetupDiDestroyDeviceInfoList(info);
return rv;
}
///////////////////////////////////////////////////////////////////////
Chapter 6
Testing and Debugging
Before looking at other aspects of WDM drivers, it is worth while looking at how to test and debug drivers. This chapter explains how to use the DebugPrint tool that comes with the book software. This lets a driver "print" debug event messages to a Win32 application, the DebugPrint Monitor.
Читать дальше