#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;
}
Работа с named pipe из kernel-mode дравера
Не работает функция ZwWriteFile, всегда возвращает значения отличные от STATUS_SUCCESS, хотя pipe создаётся:
а посмотреть какой именно код ошибки она возвращает, наверно очень трудно.
Цитата: 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);
&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
P.S. что за народ пошёл? не могут даже нормально код ошибки написать ....
Попробуй передать PLARGE_INTEGER :)
(сорри, не посмотрел на дату)