![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Проблема с драйвером (WDK) |
|
C/C++ - Проблема с драйвером (WDK)
|
Новый участник Сообщения: 1 |
При попытки чтения/записи в устройство программа виснет. Ошибку сам найти не могу, рассчитываю на помощь более опытных людей.
Код procgen.h #pragma once #define IOCTL_PROCGEN_VERSION CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS) #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. #define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif #ifdef __cplusplus extern "C" { #endif #include <ntddk.h> #include <ntddstor.h> #include <mountdev.h> #include <ntddvol.h> #include <string.h> #include "procgen.h" #ifdef __cplusplus } #endif Код драйвера, регистрирующего устройство: #include "stdafx.h" const WCHAR g_NtDevice[]=L"\\Device\\procgen"; const WCHAR g_Win32Device[]=L"\\DosDevices\\procgen"; const WCHAR g_Version[]=L"ProcGen version: 1.0"; typedef struct _DEVICE_EXTENSION { PDRIVER_OBJECT DriverObject; PDEVICE_OBJECT DeviceObject; PFILE_OBJECT FileObject; HANDLE Handle; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; DRIVER_INITIALIZE DriverEntry; DRIVER_UNLOAD DriverUnload; DRIVER_DISPATCH DeviceCreate; DRIVER_DISPATCH DeviceClose; DRIVER_DISPATCH DeviceIoControl; DRIVER_DISPATCH DefaultHandler; NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING lpszRegistryPath) { NTSTATUS retStatus; UNICODE_STRING lpszNtDevice; UNICODE_STRING lpszWin32Device; PDEVICE_OBJECT pDevice; PDEVICE_EXTENSION pDeviceExtension; int i; for(i=0; i<IRP_MJ_MAXIMUM_FUNCTION; i++) pDriver->MajorFunction[i]=DefaultHandler; pDriver->DriverUnload=DriverUnload; pDriver->MajorFunction[IRP_MJ_CREATE]=DeviceCreate; pDriver->MajorFunction[IRP_MJ_CLOSE]=DeviceClose; pDriver->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DeviceIoControl; pDevice=NULL; RtlInitUnicodeString(&lpszNtDevice, g_NtDevice); retStatus=IoCreateDevice(pDriver, sizeof(DEVICE_EXTENSION), &lpszNtDevice, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevice); if(!NT_SUCCESS(retStatus)) return retStatus; if(!pDevice) return STATUS_UNEXPECTED_IO_ERROR; RtlInitUnicodeString(&lpszWin32Device, g_Win32Device); retStatus=IoCreateSymbolicLink(&lpszWin32Device, &lpszNtDevice); if(!NT_SUCCESS(retStatus)) { IoDeleteDevice(pDevice); return retStatus; } pDeviceExtension=(PDEVICE_EXTENSION)pDevice->DeviceExtension; pDeviceExtension->DeviceObject=pDevice; pDeviceExtension->DriverObject=pDriver; return retStatus; } VOID DriverUnload(PDRIVER_OBJECT pDriver) { UNICODE_STRING lpszWin32Device; RtlInitUnicodeString(&lpszWin32Device, g_Win32Device); IoDeleteSymbolicLink(&lpszWin32Device); IoDeleteDevice(pDriver->DeviceObject); } NTSTATUS DeviceCreate(PDEVICE_OBJECT pDevice, PIRP pIrp) { pIrp->IoStatus.Status=STATUS_SUCCESS; pIrp->IoStatus.Information=0; IoCompleteRequest(pIrp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS DeviceClose(PDEVICE_OBJECT pDevice, PIRP pIrp) { pIrp->IoStatus.Status=STATUS_SUCCESS; pIrp->IoStatus.Information=0; IoCompleteRequest(pIrp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS DeviceIoControl(PDEVICE_OBJECT pDevice, PIRP pIrp) { PIO_STACK_LOCATION pIoStack; PVOID pIoBuffer; ULONG uOutputLength; ULONG uIoControlCode; pIoStack=IoGetCurrentIrpStackLocation(pIrp); pIoBuffer=pIrp->AssociatedIrp.SystemBuffer; uIoControlCode=pIoStack->Parameters.DeviceIoControl.IoControlCode; switch(uIoControlCode) { case IOCTL_PROCGEN_VERSION: uOutputLength=pIoStack->Parameters.DeviceIoControl.OutputBufferLength; wcsncpy_s((PWSTR)pIoBuffer, uOutputLength/sizeof(WCHAR), g_Version, wcslen(g_Version)); pIrp->IoStatus.Status=STATUS_SUCCESS; pIrp->IoStatus.Information=0; break; default: pIrp->IoStatus.Status=STATUS_INVALID_PARAMETER; pIrp->IoStatus.Information=0; } return pIrp->IoStatus.Status; } NTSTATUS DefaultHandler(PDEVICE_OBJECT pDevice, PIRP pIrp) { pIrp->IoStatus.Status=STATUS_NOT_SUPPORTED; pIrp->IoStatus.Information=0; IoCompleteRequest(pIrp, IO_NO_INCREMENT); return pIrp->IoStatus.Status; } #include <Windows.h> #include <stdio.h> #include "procgen.h" int main(int argc, char** argv) { HANDLE hDevice=INVALID_HANDLE_VALUE; hDevice=CreateFile(L"\\\\.\\procgen", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hDevice==INVALID_HANDLE_VALUE) { printf("Can't open device (error %i) \n",GetLastError()); return EXIT_FAILURE; } WCHAR wcBuffer[64]; ZeroMemory(wcBuffer, sizeof(WCHAR)*64); DWORD iReadCounter=0; DeviceIoControl(hDevice, IOCTL_PROCGEN_VERSION, NULL, 0, wcBuffer, 64, &iReadCounter, NULL); wprintf(L"Device: %s \n", wcBuffer); CloseHandle(hDevice); system("PAUSE"); return EXIT_SUCCESS; } Текст sources |
|
Отправлено: 16:43, 13-04-2012 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Debian/Ubuntu - Проблема с драйвером. | Ratus90 | Общий по Linux | 7 | 03-02-2012 21:56 | |
Проблема с драйвером видеокарты | Tensh | Поиск драйверов, прошивок и руководств | 7 | 27-04-2011 18:33 | |
В чём разница между драйвером PNP и текстовым драйвером? | VadimN96 | Хочу все знать | 2 | 26-04-2011 19:00 | |
проблема с видеокартой и драйвером | bakla | Видеокарты | 6 | 25-03-2009 12:14 |
|