Не работает функция ZwWriteFile, всегда возвращает значения отличные от STATUS_SUCCESS, хотя pipe создаётся: Код (Text): #include <ntddk.h> #define DEBUG /* Создаем макрос для вывода отладочных сообщений в случае компиляции с директивой DEBUG */ #ifdef DEBUG #define DPRINT DbgPrint #else #define DPRINT #endif #define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000 #define FILE_PIPE_MESSAGE_TYPE 0x00000001 #define FILE_PIPE_BYTE_STREAM_MODE 0x00000000 #define FILE_PIPE_MESSAGE_MODE 0x00000001 #define FILE_PIPE_QUEUE_OPERATION 0x00000000 #define FILE_PIPE_COMPLETE_OPERATION 0x00000001 typedef struct _NAMED_PIPE_CREATE_PARAMETERS { ULONG NamedPipeType; ULONG ReadMode; ULONG CompletionMode; ULONG MaximumInstances; ULONG InboundQuota; ULONG OutboundQuota; LARGE_INTEGER DefaultTimeout; BOOLEAN TimeoutSpecified; } NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS; UNICODE_STRING DeviceName; UNICODE_STRING SymbolicLinkName; UNICODE_STRING PipeName; HANDLE PipeHandle = NULL; PDEVICE_OBJECT deviceObject = NULL; UNICODE_STRING uszCreate; UNICODE_STRING uszRead; UNICODE_STRING uszWrite; UNICODE_STRING uszClose; NTSTATUS NtCreateNamedPipeFile ( OUT PHANDLE FileHandle, IN ULONG DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN ULONG NamedPipeType, IN ULONG ReadMode, IN ULONG CompletionMode, IN ULONG MaximumInstances, IN ULONG InboundQuota, IN ULONG OutboundQuota, IN PLARGE_INTEGER DefaultTimeout OPTIONAL ) { NAMED_PIPE_CREATE_PARAMETERS NamedPipeParms; NTSTATUS Status; __try { if ( DefaultTimeout ) { NamedPipeParms.TimeoutSpecified = TRUE; NamedPipeParms.DefaultTimeout.QuadPart = DefaultTimeout->QuadPart; } else { NamedPipeParms.TimeoutSpecified = FALSE; } NamedPipeParms.NamedPipeType = NamedPipeType; NamedPipeParms.ReadMode = ReadMode; NamedPipeParms.CompletionMode = CompletionMode; NamedPipeParms.MaximumInstances = MaximumInstances; NamedPipeParms.InboundQuota = InboundQuota; NamedPipeParms.OutboundQuota = OutboundQuota; Status = IoCreateFile ( FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, NULL, 0, ShareAccess, CreateDisposition, CreateOptions, NULL, 0, CreateFileTypeNamedPipe, &NamedPipeParms, 0 ); return Status; } __except (EXCEPTION_EXECUTE_HANDLER) { DPRINT("NtCreateNamedPipeFile: Exception occured.\n"); return STATUS_UNSUCCESSFUL; } } VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { DPRINT("Driver unloaded"); IoDeleteSymbolicLink(&SymbolicLinkName); IoDeleteDevice(deviceObject); if(PipeHandle) ZwClose(PipeHandle); return; } NTSTATUS DriverDispatcher(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PIO_STACK_LOCATION pisl; NTSTATUS ns = STATUS_SUCCESS; NTSTATUS statpipe; IO_STATUS_BLOCK IoStat; pisl = IoGetCurrentIrpStackLocation(Irp); Irp->IoStatus.Information = 0; __try{ if ( pisl->MajorFunction == IRP_MJ_CREATE) { DPRINT("Create file"); statpipe=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszCreate.Buffer,uszCreate.Length+2,NULL,NULL); if(statpipe!=STATUS_SUCCESS) DPRINT("Error write to pipe"); } if ( pisl->MajorFunction == IRP_MJ_CLOSE) { DPRINT("Close file"); statpipe=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszClose.Buffer,uszClose.Length+2,NULL,NULL); if(statpipe!=STATUS_SUCCESS) DPRINT("Error write to pipe"); } if ( pisl->MajorFunction == IRP_MJ_WRITE) { DPRINT("Write file"); statpipe=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszWrite.Buffer,uszWrite.Length+2,NULL,NULL); if(statpipe!=STATUS_SUCCESS) DPRINT("Error write to pipe"); } if ( pisl->MajorFunction == IRP_MJ_READ) { DPRINT("Read file"); statpipe=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszRead.Buffer,uszRead.Length+2,NULL,NULL); if(statpipe!=STATUS_SUCCESS) DPRINT("Error write to pipe"); } } __except(EXCEPTION_EXECUTE_HANDLER) { DPRINT("Exception"); } Irp->IoStatus.Status = ns; IoCompleteRequest(Irp, IO_NO_INCREMENT); return ns; } NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { NTSTATUS st; PCWSTR dDeviceName = L"\\Device\\MyDriver"; PCWSTR dSymbolicLinkName = L"\\DosDevices\\MyDriver"; PCWSTR dPipeName = L"\\??\\pipe\\FileSniffer"; PDRIVER_DISPATCH *ppdd; OBJECT_ATTRIBUTES Attr; IO_STATUS_BLOCK IoStat; LARGE_INTEGER nTimeOut; RtlInitUnicodeString(&DeviceName, dDeviceName); RtlInitUnicodeString(&SymbolicLinkName, dSymbolicLinkName); RtlInitUnicodeString(&PipeName, dPipeName); RtlInitUnicodeString(&uszCreate,L"Create file"); RtlInitUnicodeString(&uszRead,L"Read file"); RtlInitUnicodeString(&uszWrite,L"Write file"); RtlInitUnicodeString(&uszClose,L"Close file"); st = IoCreateDevice(DriverObject, // указатель на DriverObject 0, // размер памяти (device extension) &DeviceName, // имя создаваемого устройства FILE_DEVICE_NULL, // тип создаваемого устройства 0, // характеристики устройства FALSE, // "эксклюзивное" устройство &deviceObject); // указатель на объект устройства if(st == STATUS_SUCCESS) st = IoCreateSymbolicLink(&SymbolicLinkName, // имя создаваемой символической ссылки &DeviceName); // имя устройства InitializeObjectAttributes(&Attr,&PipeName,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL); nTimeOut.QuadPart = -1000; st = NtCreateNamedPipeFile( &PipeHandle, FILE_ANY_ACCESS, &Attr, &IoStat, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_CREATE, 0, FILE_PIPE_BYTE_STREAM_TYPE, FILE_PIPE_BYTE_STREAM_MODE, FILE_PIPE_QUEUE_OPERATION, 1, 0, 0, &nTimeOut); if(st != STATUS_SUCCESS) DPRINT("Pipe error!"); st=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszRead.Buffer,uszRead.Length+2,NULL,NULL); if(st != STATUS_SUCCESS) DPRINT("Pipe error!"); ppdd = DriverObject->MajorFunction; ppdd[IRP_MJ_CREATE] = ppdd[IRP_MJ_CLOSE ] = ppdd[IRP_MJ_WRITE ] = ppdd[IRP_MJ_READ ] = DriverDispatcher; DriverObject->DriverUnload = DriverUnload; DPRINT("Driver loaded"); return STATUS_SUCCESS; }
изменил st = NtCreateNamedPipeFile( &PipeHandle, SYNCHRONIZE | GENERIC_ALL | FILE_WRITE_DATA, &Attr, &IoStat, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_CREATE, 0, FILE_PIPE_BYTE_STREAM_TYPE, FILE_PIPE_BYTE_STREAM_MODE, FILE_PIPE_QUEUE_OPERATION, 1, 0, 0, &nTimeOut); коды ошибок в DriverEntry -1073741645 в DriverDispatcher 0
и что он означает? у меня pipe открывается для чтения из приложения, но уже после загрузки драйвера. Кроме того, при выгрузке драйвера, если к нему обращались через \\.\MyDriver, возникает BSOD.
к сожалению, когда прога подключена, BSOD возникает сразу: STOP: 0x0000008e (0xc0000005, 0x00000000, 0xb8278bb4, 0x00000000)
Что значит подключена? Загружаешь драйвер. Потом коннектишься к пайпу. После этого уже можешь вызывать ZwWriteFile(hPipe, ...) в драйвере.
Небольшой примерчик, правда пайп безымянный, но сути это не меняет: Создаем пайп (юзермод): Код (Text): if not CreatePipe(hPipeRead, hPipeWrite, nil, 0) then // ни хера не получилось Дальше следует передать хэндл пайпа в драйвер. Через IOCTL. И можно писать... Пишем в пайп (кернел): Код (Text): IO_STATUS_BLOCK isb; KAPC_STATE ApcState; SOME_STRUCT ss; KeStackAttachProcess(OwnProcess, &ApcState); ZwWriteFile(hPipeWrite, NULL, NULL, NULL, &isb, &ss, sizeof(SOME_STRUCT), NULL, NULL); KeUnstackDetachProcess(&ApcState); Читаем в юзермоде: Код (Text): procedure ReadPipeThread(lpParam: pointer); stdcall; var Buf: SOME_STRUCT; dwBytesRead: DWORD; begin while true do begin if ReadFile(hPipeRead, Buf, SizeOf(SOME_STRUCT), dwBytesRead, nil) then begin // тут действа с данными end; end; end;
KeStackAttachProcess и KeUnstackDetachProcess - зачем они? когда обращаюсь к драйверу устройства через "copy con \\.\MyDriver" система вылетает. Коды ошибок теперь равны 0, из DriverEntry ZwWriteFile удалён.
Ага, выложу, когда доступ к компу своему получу, ещё вопрос, немного не по теме: Имеется ли в винде единый драйвер, который обрабатывает все запросы к ФС, или же каждый диск обрабатывается отдельно. === где можно скачать IFS ? Похоже, что мелкософт распространяет инструменты для разработки драйверов по отдельности.
Ты сначала разберись - тебя интересует ДИСК (физическое устройство) или файловая система. Для каждого накопителя физического, Вообще говоря, свой драйвер (для IDE хардов - один, для флешек - другой, для флопиков - третий и т.п.) File System Recognizer определяет файловую систему тома и грузит соотв. драйвер ФС. Он монтирует диск/раздел и уже в дальнейшем обрабатывает файловые запросы к нему.
судя по реакции системы опускать нельзя, но при этом в DDK я таких функций не нашёл, они есть только в IFS, которой у меня нет. 2 Great: File System Recognizer представлен в системе отдельным драйвером? === а хотя нет, система падает всё равно, просмотрел дамп памяти, ничего дельного не нашёл, в стеке только функции ядра относящиеся к ошибке. Падает система не в драйвере, так как отладочная печать показывает и вход в DriverDispatcher и выход из неё, причём приложение успевает прочитать данные из пайпа и cmd выдать приглашение к следующей команде.
Плохо ты искал. В MSDN Library они есть. И в онлайн версии тоже (правда там причислено к IFS все-таки): http://msdn.microsoft.com/en-us/library/ms796307.aspx Он специально сделан, чтобы не грузить "тяжеловесные" драйвера файловых систем только с целью опознать систему на носителе. Только, когда будет достоверно известно про ФС носителя, тогда можно и соотв. драйвер грузить. ЗЫ. А мы все еще ждем !analyze -v
Оно? Код (Text): Loading Dump File [F:\MEMORY.DMP] Kernel Summary Dump File: Only kernel address space is available Microsoft (R) Windows Kernel Debugger Version 3.0.0020.0 Copyright (c) Microsoft Corporation. All rights reserved. Loaded dbghelp extension DLL Loaded ext extension DLL Loaded exts extension DLL Loaded kext extension DLL Loaded kdexts extension DLL Symbol search path is: *** Invalid *** : Verify _NT_SYMBOL_PATH setting Executable search path is: ********************************************************************* * Symbols can not be loaded because symbol path is not initialized. * * * * The Symbol Path can be set by: * * using the _NT_SYMBOL_PATH environment variable. * * using the -y <symbol_path> argument when starting the debugger. * * using .sympath and .sympath+ * ********************************************************************* *** ERROR: Symbol file could not be found. Defaulted to export symbols for ntoskrnl.exe - Windows XP Kernel Version 2600 (Service Pack 2) UP Free x86 compatible Built by: 2600.xpsp_sp2_qfe.061219-0311 Kernel base = 0x804d7000 PsLoadedModuleList = 0x8055a820 Debug session time: Wed Jun 04 17:19:31 2008 System Uptime: 0 days 0:03:00 ********************************************************************* * Symbols can not be loaded because symbol path is not initialized. * * * * The Symbol Path can be set by: * * using the _NT_SYMBOL_PATH environment variable. * * using the -y <symbol_path> argument when starting the debugger. * * using .sympath and .sympath+ * ********************************************************************* WaitForEvent failed WARNING: Stack unwind information not available. Following frames may be wrong. WARNING: Stack unwind information not available. Following frames may be wrong. ******************************************************************************* * * * Bugcheck Analysis * * * ******************************************************************************* ***** Kernel symbols are WRONG. Please fix symbols to do bugcheck analysis. ******************************************************************************* * * * Bugcheck Analysis * * * ******************************************************************************* Bugcheck code 0000008E Arguments c0000005 00000000 b8771bb4 00000000 ChildEBP RetAddr Args to Child WARNING: Stack unwind information not available. Following frames may be wrong. b877177c 8051d875 0000008e c0000005 00000000 ntoskrnl!KeBugCheckEx+0x1b b8771b44 804df235 b8771b60 00000000 b8771bb4 ntoskrnl!IoSetFileOrigin+0x58e9 b8771bb4 00000000 badb0d00 30f20004 804ec9e1 ntoskrnl!Kei386EoiHelper+0x1d9 eax=ffdff13c ebx=00000000 ecx=00000000 edx=804db4ae esi=b8771b60 edi=00000000 eip=80533736 esp=b8771764 ebp=b877177c iopl=0 nv up ei ng nz na po nc cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286 ntoskrnl!KeBugCheckEx+1b: 80533736 5d pop ebp kd> !analize -v No export analize found А функции в MSDN я тоже видел, вот только в хедерах у меня их нету, пришлось искать отдельно.