Chris Cant - Writing Windows WDM Device Drivers

Здесь есть возможность читать онлайн «Chris Cant - Writing Windows WDM Device Drivers» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Lawrence, Kansas 66046, ISBN: , Издательство: R & D Books, Жанр: Программирование, на английском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Writing Windows WDM Device Drivers: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Writing Windows WDM Device Drivers»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Writing Windows WDM Device Drivers — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Writing Windows WDM Device Drivers», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

//////////////////////////////////////////////////////////////////////

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Writing Windows WDM Device Drivers»

Представляем Вашему вниманию похожие книги на «Writing Windows WDM Device Drivers» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Writing Windows WDM Device Drivers»

Обсуждение, отзывы о книге «Writing Windows WDM Device Drivers» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x