📄 driverentry.c
字号:
#include <ntddk.h>
NTSTATUS DrvLog(char* buffer){
NTSTATUS ntstatus;
ANSI_STRING ansistring;
UNICODE_STRING filename;
//WCHAR file[]=L"\\SystemRoot\\DRV.LOG";
WCHAR file[]=L"\\??\\C:\\DRV.LOG";
HANDLE hf=0;
IO_STATUS_BLOCK IoStatusBlock;
OBJECT_ATTRIBUTES ObjectAttributes;
FILE_POSITION_INFORMATION FileInformation;
FILE_STANDARD_INFORMATION stdinf;
RtlInitAnsiString(
&ansistring,
buffer
);
RtlInitUnicodeString(
&filename,
file
);
InitializeObjectAttributes(
&ObjectAttributes,
&filename,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
ntstatus=ZwCreateFile(
&hf,
GENERIC_WRITE|SYNCHRONIZE|GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_DELETE,
FILE_OPEN_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0
);
if (!NT_SUCCESS(ntstatus)){
return ntstatus;
}
ZwQueryInformationFile(
hf,
&IoStatusBlock,
(void*)&stdinf,
sizeof(stdinf),
FileStandardInformation
);
if (!NT_SUCCESS(IoStatusBlock.Status)){
return IoStatusBlock.Status;
}
FileInformation.CurrentByteOffset=stdinf.EndOfFile;
ZwSetInformationFile(
hf,
&IoStatusBlock,
(void*)&FileInformation,
sizeof(FileInformation),
FilePositionInformation
);
if (!NT_SUCCESS(IoStatusBlock.Status)){
return IoStatusBlock.Status;
}
ZwWriteFile(
hf,
0,
0,
0,
&IoStatusBlock,
buffer,
ansistring.Length,
NULL,
NULL
);
ZwClose(hf);
return IoStatusBlock.Status;
}
NTSTATUS Create(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){
Irp->IoStatus.Status = STATUS_SUCCESS;
return DrvLog("Createing Device\a\n");
}
NTSTATUS Close(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){
Irp->IoStatus.Status = STATUS_SUCCESS;
return DrvLog("Closing Device\a\n");
}
NTSTATUS CreateDevice(PDRIVER_OBJECT DriverObject,PWCHAR devicename){
NTSTATUS ntstatus;
PDEVICE_OBJECT DeviceObject;
UNICODE_STRING devname;
WCHAR buff[100];
UNICODE_STRING SymbolicLinkName;
devname.Buffer=buff;
devname.MaximumLength=100;
RtlAppendUnicodeToString(&devname,L"\\Device\\");
RtlAppendUnicodeToString(&devname,devicename);
RtlInitUnicodeString(&SymbolicLinkName,L"\\??\\Z:");
//创建DEVICE OBJECT.有了DEVICE OBJECT.才能创建符号联接.
//创建符号联接,才使系统可见,系统可见,才使应用程序能进行
//各种操作,能使应用程序进行各种操作,DRIVER才真正有用...
ntstatus=IoCreateDevice(
DriverObject,
0,
&devname,
FILE_DEVICE_UNKNOWN,
0,
1,
&DeviceObject
);
if (!NT_SUCCESS(ntstatus)){
return ntstatus;
}
//IoCreateSymbolicLink用来创建系统可见的对象.
//要使系统可见.符号联接必须位于\??\下.老的NT
//用\DosDevices\.当然目前的NT也支持\DosDevices\
//格式.但\DosDevices\仅是\??\的一个符号联接.
ntstatus=IoCreateSymbolicLink(
&SymbolicLinkName,
&devname
);
return ntstatus;
}
//DRIVERENTRY是NT驱动程序的标准入口.
//它传入2个参数.一个系统创建的DRIVER对象.和指向属于DRIVER的注册表关键字.
//我这DRIVER里面仅有CREATE,CLOSE的支持.是个不完整的DRIVER.
DriverEntry(PDRIVER_OBJECT pdrv,PUNICODE_STRING pus){
pdrv->MajorFunction[IRP_MJ_CREATE]=Create;
pdrv->MajorFunction[IRP_MJ_CLOSE]=Close;
CreateDevice(pdrv,L"drv"); //DRIVER HELPER FUNCTION. HELP TO FULFIL
//ROUTIONES TO CREATE DEVICE OBJECT...
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -