Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с named pipe из kernel-mode дравера

9.5K
02 июня 2008 года
O01eg
33 / / 09.10.2005
Не работает функция ZwWriteFile, всегда возвращает значения отличные от STATUS_SUCCESS, хотя pipe создаётся:
Код:
#include <ntddk.h>
//#include "ntifs.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;
}
261
02 июня 2008 года
ahilles
1.5K / / 03.11.2005
а посмотреть какой именно код ошибки она возвращает, наверно очень трудно.
9.5K
02 июня 2008 года
O01eg
33 / / 09.10.2005
Цитата: ahilles
а посмотреть какой именно код ошибки она возвращает, наверно очень трудно.


изменил

Код:
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
261
03 июня 2008 года
ahilles
1.5K / / 03.11.2005
в нормальном виде это - С00000В3. С другой стороны канала никого нет. Поэтому и ошибка.
P.S. что за народ пошёл? не могут даже нормально код ошибки написать ....
19K
29 июля 2008 года
Wizard109
7 / / 17.10.2007
Кажется дело в предпоследнем параметре функции...
Попробуй передать PLARGE_INTEGER :)
(сорри, не посмотрел на дату)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог