работа с named pipe из драйвера

Тема в разделе "WASM.NT.KERNEL", создана пользователем O01eg, 2 июн 2008.

  1. O01eg

    O01eg New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    8
    Не работает функция ZwWriteFile, всегда возвращает значения отличные от STATUS_SUCCESS, хотя pipe создаётся:
    Код (Text):
    1. #include <ntddk.h>
    2.  
    3. #define DEBUG
    4.  
    5. /*
    6. Создаем макрос для вывода отладочных сообщений
    7. в случае компиляции с директивой DEBUG
    8. */
    9.  
    10. #ifdef DEBUG
    11.   #define DPRINT DbgPrint
    12. #else
    13.   #define DPRINT
    14. #endif
    15.  
    16. #define FILE_PIPE_BYTE_STREAM_TYPE      0x00000000
    17. #define FILE_PIPE_MESSAGE_TYPE          0x00000001
    18.  
    19. #define FILE_PIPE_BYTE_STREAM_MODE      0x00000000
    20. #define FILE_PIPE_MESSAGE_MODE          0x00000001
    21.  
    22. #define FILE_PIPE_QUEUE_OPERATION       0x00000000
    23. #define FILE_PIPE_COMPLETE_OPERATION    0x00000001
    24.  
    25. typedef struct _NAMED_PIPE_CREATE_PARAMETERS {
    26.     ULONG           NamedPipeType;
    27.     ULONG           ReadMode;
    28.     ULONG           CompletionMode;
    29.     ULONG           MaximumInstances;
    30.     ULONG           InboundQuota;
    31.     ULONG           OutboundQuota;
    32.     LARGE_INTEGER   DefaultTimeout;
    33.     BOOLEAN         TimeoutSpecified;
    34. } NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS;
    35.  
    36. UNICODE_STRING DeviceName;
    37. UNICODE_STRING SymbolicLinkName;
    38. UNICODE_STRING PipeName;
    39. HANDLE PipeHandle = NULL;
    40. PDEVICE_OBJECT deviceObject = NULL;
    41.  
    42. UNICODE_STRING uszCreate;
    43. UNICODE_STRING uszRead;
    44. UNICODE_STRING uszWrite;
    45. UNICODE_STRING uszClose;
    46.  
    47. NTSTATUS  NtCreateNamedPipeFile (
    48.          OUT PHANDLE FileHandle,
    49.          IN ULONG DesiredAccess,
    50.          IN POBJECT_ATTRIBUTES ObjectAttributes,
    51.          OUT PIO_STATUS_BLOCK IoStatusBlock,
    52.          IN ULONG ShareAccess,
    53.          IN ULONG CreateDisposition,
    54.          IN ULONG CreateOptions,
    55.          IN ULONG NamedPipeType,
    56.          IN ULONG ReadMode,
    57.          IN ULONG CompletionMode,
    58.          IN ULONG MaximumInstances,
    59.          IN ULONG InboundQuota,
    60.          IN ULONG OutboundQuota,
    61.          IN PLARGE_INTEGER DefaultTimeout OPTIONAL
    62.          )  
    63.          
    64. {  
    65.    NAMED_PIPE_CREATE_PARAMETERS NamedPipeParms;
    66.    NTSTATUS Status;
    67.    __try  
    68.    {  
    69.       if ( DefaultTimeout )
    70.       {
    71.             NamedPipeParms.TimeoutSpecified = TRUE;
    72.             NamedPipeParms.DefaultTimeout.QuadPart = DefaultTimeout->QuadPart;
    73.       }
    74.       else
    75.       {  
    76.          NamedPipeParms.TimeoutSpecified = FALSE;
    77.       }
    78.        
    79.       NamedPipeParms.NamedPipeType = NamedPipeType;
    80.       NamedPipeParms.ReadMode = ReadMode;
    81.       NamedPipeParms.CompletionMode = CompletionMode;
    82.       NamedPipeParms.MaximumInstances = MaximumInstances;
    83.       NamedPipeParms.InboundQuota = InboundQuota;
    84.       NamedPipeParms.OutboundQuota = OutboundQuota;
    85.       Status = IoCreateFile (
    86.                FileHandle,
    87.                DesiredAccess,
    88.                ObjectAttributes,
    89.                IoStatusBlock,
    90.                NULL,
    91.                0,
    92.                ShareAccess,
    93.                CreateDisposition,
    94.                CreateOptions,
    95.                NULL,
    96.                0,
    97.                CreateFileTypeNamedPipe,
    98.                &NamedPipeParms,
    99.                0  
    100.                );
    101.  
    102.       return Status;
    103.    }  
    104.    __except (EXCEPTION_EXECUTE_HANDLER)  
    105.    {
    106.       DPRINT("NtCreateNamedPipeFile: Exception occured.\n");
    107.       return STATUS_UNSUCCESSFUL;  
    108.    }
    109. }  
    110.  
    111. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    112. {
    113.     DPRINT("Driver unloaded");
    114.     IoDeleteSymbolicLink(&SymbolicLinkName);
    115.     IoDeleteDevice(deviceObject);
    116.     if(PipeHandle)
    117.         ZwClose(PipeHandle);
    118.     return;
    119. }
    120.  
    121. NTSTATUS DriverDispatcher(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    122. {
    123.     PIO_STACK_LOCATION pisl;
    124.     NTSTATUS           ns = STATUS_SUCCESS;
    125.     NTSTATUS statpipe;
    126.     IO_STATUS_BLOCK IoStat;
    127.  
    128.     pisl = IoGetCurrentIrpStackLocation(Irp);
    129.     Irp->IoStatus.Information = 0;
    130.    
    131.     __try{
    132.         if ( pisl->MajorFunction == IRP_MJ_CREATE) {
    133.             DPRINT("Create file");
    134.             statpipe=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszCreate.Buffer,uszCreate.Length+2,NULL,NULL);
    135.             if(statpipe!=STATUS_SUCCESS)
    136.                 DPRINT("Error write to pipe");
    137.         }
    138.         if ( pisl->MajorFunction == IRP_MJ_CLOSE) {
    139.             DPRINT("Close file");
    140.             statpipe=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszClose.Buffer,uszClose.Length+2,NULL,NULL);
    141.             if(statpipe!=STATUS_SUCCESS)
    142.                 DPRINT("Error write to pipe");         
    143.         }
    144.         if ( pisl->MajorFunction == IRP_MJ_WRITE) {
    145.             DPRINT("Write file");
    146.             statpipe=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszWrite.Buffer,uszWrite.Length+2,NULL,NULL);
    147.             if(statpipe!=STATUS_SUCCESS)
    148.                 DPRINT("Error write to pipe");         
    149.         }
    150.         if ( pisl->MajorFunction == IRP_MJ_READ) {
    151.             DPRINT("Read file");
    152.             statpipe=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszRead.Buffer,uszRead.Length+2,NULL,NULL);
    153.             if(statpipe!=STATUS_SUCCESS)
    154.                 DPRINT("Error write to pipe");         
    155.         }      
    156.     }
    157.     __except(EXCEPTION_EXECUTE_HANDLER)
    158.     {
    159.         DPRINT("Exception");
    160.     }
    161.    
    162.     Irp->IoStatus.Status = ns;
    163.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    164.     return ns;
    165. }
    166.  
    167.  
    168. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,
    169.                      PUNICODE_STRING RegistryPath)
    170. {
    171.     NTSTATUS st;
    172.     PCWSTR   dDeviceName = L"\\Device\\MyDriver";
    173.     PCWSTR   dSymbolicLinkName = L"\\DosDevices\\MyDriver";
    174.     PCWSTR   dPipeName = L"\\??\\pipe\\FileSniffer";
    175.     PDRIVER_DISPATCH *ppdd;
    176.     OBJECT_ATTRIBUTES Attr;
    177.     IO_STATUS_BLOCK IoStat;
    178.     LARGE_INTEGER nTimeOut;
    179.    
    180.     RtlInitUnicodeString(&DeviceName, dDeviceName);
    181.     RtlInitUnicodeString(&SymbolicLinkName, dSymbolicLinkName);
    182.     RtlInitUnicodeString(&PipeName, dPipeName);
    183.    
    184.     RtlInitUnicodeString(&uszCreate,L"Create file");
    185.     RtlInitUnicodeString(&uszRead,L"Read file");
    186.     RtlInitUnicodeString(&uszWrite,L"Write file");
    187.     RtlInitUnicodeString(&uszClose,L"Close file");
    188.  
    189.     st = IoCreateDevice(DriverObject,       // указатель на DriverObject
    190.         0,                  // размер памяти (device extension)
    191.         &DeviceName,        // имя создаваемого устройства
    192.         FILE_DEVICE_NULL,   // тип создаваемого устройства
    193.         0,                  // характеристики устройства
    194.         FALSE,              // "эксклюзивное" устройство
    195.         &deviceObject);     // указатель на объект устройства
    196.     if(st == STATUS_SUCCESS)
    197.         st = IoCreateSymbolicLink(&SymbolicLinkName, // имя создаваемой символической ссылки
    198.             &DeviceName);      // имя устройства
    199.        
    200.     InitializeObjectAttributes(&Attr,&PipeName,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL);
    201.    
    202.     nTimeOut.QuadPart = -1000;
    203.    
    204.     st = NtCreateNamedPipeFile(
    205.         &PipeHandle,
    206.         FILE_ANY_ACCESS,
    207.         &Attr,
    208.         &IoStat,
    209.         FILE_SHARE_READ | FILE_SHARE_WRITE,
    210.         FILE_CREATE,
    211.         0,
    212.         FILE_PIPE_BYTE_STREAM_TYPE,
    213.         FILE_PIPE_BYTE_STREAM_MODE,
    214.         FILE_PIPE_QUEUE_OPERATION,
    215.         1,
    216.         0,
    217.         0,
    218.         &nTimeOut);
    219.    
    220.     if(st !=  STATUS_SUCCESS)
    221.         DPRINT("Pipe error!");
    222.    
    223.     st=ZwWriteFile(PipeHandle,NULL,NULL,NULL,&IoStat,uszRead.Buffer,uszRead.Length+2,NULL,NULL);
    224.     if(st !=  STATUS_SUCCESS)
    225.         DPRINT("Pipe error!"); 
    226.    
    227.     ppdd = DriverObject->MajorFunction;
    228.    
    229.     ppdd[IRP_MJ_CREATE] =
    230.     ppdd[IRP_MJ_CLOSE ] =
    231.     ppdd[IRP_MJ_WRITE ] =
    232.     ppdd[IRP_MJ_READ ] = DriverDispatcher;
    233.  
    234.     DriverObject->DriverUnload = DriverUnload;
    235.    
    236.     DPRINT("Driver loaded");
    237.     return STATUS_SUCCESS;
    238. }
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код ошибки?
     
  3. O01eg

    O01eg New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    8
    изменил
    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
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    оуу коды ошибок они в хексе более читабельны..
    это равно c00000b3 = STATUS_PIPE_LISTENING
     
  5. O01eg

    O01eg New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    8
    и что он означает? у меня pipe открывается для чтения из приложения, но уже после загрузки драйвера. Кроме того, при выгрузке драйвера, если к нему обращались через \\.\MyDriver, возникает BSOD.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Никто к другому концу трубы не прицеплен. Поэтому и возвращает ошибку.
     
  7. O01eg

    O01eg New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    8
    к сожалению, когда прога подключена, BSOD возникает сразу:
    STOP: 0x0000008e (0xc0000005, 0x00000000, 0xb8278bb4, 0x00000000)
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    O01eg
    Ну тогда как обычно, !analyze -v и все такое просим в студию:)
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Что значит подключена?
    Загружаешь драйвер. Потом коннектишься к пайпу. После этого уже можешь вызывать ZwWriteFile(hPipe, ...) в драйвере.
     
  10. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Небольшой примерчик, правда пайп безымянный, но сути это не меняет:

    Создаем пайп (юзермод):
    Код (Text):
    1. if not CreatePipe(hPipeRead, hPipeWrite, nil, 0) then // ни хера не получилось
    Дальше следует передать хэндл пайпа в драйвер. Через IOCTL. И можно писать...

    Пишем в пайп (кернел):
    Код (Text):
    1. IO_STATUS_BLOCK     isb;
    2. KAPC_STATE  ApcState;
    3. SOME_STRUCT ss;
    4.  
    5. KeStackAttachProcess(OwnProcess, &ApcState);
    6. ZwWriteFile(hPipeWrite, NULL, NULL, NULL, &isb, &ss, sizeof(SOME_STRUCT), NULL, NULL);
    7. KeUnstackDetachProcess(&ApcState);
    Читаем в юзермоде:
    Код (Text):
    1. procedure ReadPipeThread(lpParam: pointer); stdcall;
    2. var
    3.   Buf: SOME_STRUCT;
    4.   dwBytesRead: DWORD;
    5. begin
    6. while true do
    7.   begin
    8.   if ReadFile(hPipeRead, Buf, SizeOf(SOME_STRUCT), dwBytesRead, nil) then
    9.     begin
    10.     // тут действа с данными
    11.     end;
    12.   end;
    13. end;
     
  11. O01eg

    O01eg New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    8
    KeStackAttachProcess и KeUnstackDetachProcess - зачем они?
    когда обращаюсь к драйверу устройства через "copy con \\.\MyDriver" система вылетает. Коды ошибок теперь равны 0, из DriverEntry ZwWriteFile удалён.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    анализ минидампа в студию.
     
  13. O01eg

    O01eg New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    8
    Ага, выложу, когда доступ к компу своему получу, ещё вопрос, немного не по теме: Имеется ли в винде единый драйвер, который обрабатывает все запросы к ФС, или же каждый диск обрабатывается отдельно.
    ===
    где можно скачать IFS ? Похоже, что мелкософт распространяет инструменты для разработки драйверов по отдельности.
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ты сначала разберись - тебя интересует ДИСК (физическое устройство) или файловая система.
    Для каждого накопителя физического, Вообще говоря, свой драйвер (для IDE хардов - один, для флешек - другой, для флопиков - третий и т.п.)
    File System Recognizer определяет файловую систему тома и грузит соотв. драйвер ФС.
    Он монтирует диск/раздел и уже в дальнейшем обрабатывает файловые запросы к нему.
     
  15. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Если не известно, в контексте какого процесса мы сейчас находимся. Если известно - можно опустить.
     
  16. O01eg

    O01eg New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    8
    судя по реакции системы опускать нельзя, но при этом в DDK я таких функций не нашёл, они есть только в IFS, которой у меня нет.
    2 Great:
    File System Recognizer представлен в системе отдельным драйвером?
    ===
    а хотя нет, система падает всё равно, просмотрел дамп памяти, ничего дельного не нашёл, в стеке только функции ядра относящиеся к ошибке. Падает система не в драйвере, так как отладочная печать показывает и вход в DriverDispatcher и выход из неё, причём приложение успевает прочитать данные из пайпа и cmd выдать приглашение к следующей команде.
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Плохо ты искал. В MSDN Library они есть.
    И в онлайн версии тоже (правда там причислено к IFS все-таки): http://msdn.microsoft.com/en-us/library/ms796307.aspx

    Он специально сделан, чтобы не грузить "тяжеловесные" драйвера файловых систем только с целью опознать систему на носителе. Только, когда будет достоверно известно про ФС носителя, тогда можно и соотв. драйвер грузить.

    ЗЫ. А мы все еще ждем !analyze -v
     
  18. O01eg

    O01eg New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    8
    Оно?
    Код (Text):
    1. Loading Dump File [F:\MEMORY.DMP]
    2. Kernel Summary Dump File: Only kernel address space is available
    3.  
    4.  
    5. Microsoft (R) Windows Kernel Debugger  Version 3.0.0020.0
    6. Copyright (c) Microsoft Corporation. All rights reserved.
    7.  
    8. Loaded dbghelp extension DLL
    9. Loaded ext extension DLL
    10. Loaded exts extension DLL
    11. Loaded kext extension DLL
    12. Loaded kdexts extension DLL
    13. Symbol search path is: *** Invalid *** : Verify _NT_SYMBOL_PATH setting
    14. Executable search path is:
    15. *********************************************************************
    16. * Symbols can not be loaded because symbol path is not initialized. *
    17. *                                                                   *
    18. * The Symbol Path can be set by:                                    *
    19. *   using the _NT_SYMBOL_PATH environment variable.                 *
    20. *   using the -y <symbol_path> argument when starting the debugger. *
    21. *   using .sympath and .sympath+                                    *
    22. *********************************************************************
    23. *** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntoskrnl.exe -
    24. Windows XP Kernel Version 2600 (Service Pack 2) UP Free x86 compatible
    25. Built by: 2600.xpsp_sp2_qfe.061219-0311
    26. Kernel base = 0x804d7000 PsLoadedModuleList = 0x8055a820
    27. Debug session time: Wed Jun 04 17:19:31 2008
    28. System Uptime: 0 days 0:03:00
    29. *********************************************************************
    30. * Symbols can not be loaded because symbol path is not initialized. *
    31. *                                                                   *
    32. * The Symbol Path can be set by:                                    *
    33. *   using the _NT_SYMBOL_PATH environment variable.                 *
    34. *   using the -y <symbol_path> argument when starting the debugger. *
    35. *   using .sympath and .sympath+                                    *
    36. *********************************************************************
    37. WaitForEvent failed
    38. WARNING: Stack unwind information not available. Following frames may be wrong.
    39. WARNING: Stack unwind information not available. Following frames may be wrong.
    40. *******************************************************************************
    41. *                                                                             *
    42. *                        Bugcheck Analysis                                    *
    43. *                                                                             *
    44. *******************************************************************************
    45.  
    46. ***** Kernel symbols are WRONG. Please fix symbols to do bugcheck analysis.
    47.  
    48. *******************************************************************************
    49. *                                                                             *
    50. *                        Bugcheck Analysis                                    *
    51. *                                                                             *
    52. *******************************************************************************
    53. Bugcheck code 0000008E
    54. Arguments c0000005 00000000 b8771bb4 00000000
    55.  
    56. ChildEBP RetAddr  Args to Child              
    57. WARNING: Stack unwind information not available. Following frames may be wrong.
    58. b877177c 8051d875 0000008e c0000005 00000000 ntoskrnl!KeBugCheckEx+0x1b
    59. b8771b44 804df235 b8771b60 00000000 b8771bb4 ntoskrnl!IoSetFileOrigin+0x58e9
    60. b8771bb4 00000000 badb0d00 30f20004 804ec9e1 ntoskrnl!Kei386EoiHelper+0x1d9
    61.  
    62. eax=ffdff13c ebx=00000000 ecx=00000000 edx=804db4ae esi=b8771b60 edi=00000000
    63. eip=80533736 esp=b8771764 ebp=b877177c iopl=0         nv up ei ng nz na po nc
    64. cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000286
    65. ntoskrnl!KeBugCheckEx+1b:
    66. 80533736 5d               pop     ebp
    67. kd> !analize -v
    68. No export analize found
    А функции в MSDN я тоже видел, вот только в хедерах у меня их нету, пришлось искать отдельно.
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Читай лучше: