驱动源码
MyDriver2
#include<ntddk.h>
#define DEVICE_NAME L"\\Device\\MyFirstDevice"
#define SYM_NAME L"\\??\\MyFirstDevice"
VOID nothing(HANDLE ppid, HANDLE mypid, BOOLEAN bcreate)
{
DbgPrint("ProcessNotify\n");
}
VOID DrvUnload(PDRIVER_OBJECT pdriver)
{
DbgPrint("Unload\n");
if (pdriver->DeviceObject)
{
IoDeleteDevice(pdriver->DeviceObject);
UNICODE_STRING symname = { 0 };
RtlInitUnicodeString(&symname, SYM_NAME);
IoDeleteSymbolicLink(&symname);
}
PsSetCreateProcessNotifyRoutine(nothing, TRUE);
}
NTSTATUS MyCreate(PDEVICE_OBJECT pdevice, PIRP pirp) //PDEVICE_OBJECT
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("My Device has be opened\n");
pirp->IoStatus.Status = status;
pirp->IoStatus.Information = 0;
IoCompleteRequest(pirp, IO_NO_INCREMENT);
return 0;
}
NTSTATUS MyClose(PDEVICE_OBJECT pdevice, PIRP pirp) //PDEVICE_OBJECT
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("My Device has be MyClose\n");
pirp->IoStatus.Status = status;
pirp->IoStatus.Information = 0;
IoCompleteRequest(pirp, IO_NO_INCREMENT);
return 0;
}
NTSTATUS MyCleanUp(PDEVICE_OBJECT pdevice, PIRP pirp) //PDEVICE_OBJECT
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("My Device has be MyCleanUp\n");
pirp->IoStatus.Status = status;
pirp->IoStatus.Information = 0;
IoCompleteRequest(pirp, IO_NO_INCREMENT);
return 0;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) //PDRIVER_OBJECT
{
NTSTATUS status = STATUS_SUCCESS;
UNICODE_STRING devicename = { 0 };
PDEVICE_OBJECT pdevice = NULL;
driver->DriverUnload = DrvUnload;
RtlInitUnicodeString(&devicename, DEVICE_NAME);
status = IoCreateDevice(driver, 0, &devicename, FILE_DEVICE_UNKNOWN, 0, TRUE, &pdevice);
if (!NT_SUCCESS(status)){
DbgPrint("Create Device Failed : %x\n", status);
return status;
}
UNICODE_STRING symname = { 0 };
RtlInitUnicodeString(&symname, SYM_NAME);
status = IoCreateSymbolicLink(&symname, &devicename);
if (!NT_SUCCESS(status))
{
DbgPrint("Create SymbolicLink Failed : %x\n", status);
IoDeleteDevice(pdevice);
return status;
}
driver->MajorFunction[IRP_MJ_CREATE] = MyCreate;
driver->MajorFunction[IRP_MJ_CLOSE] = MyClose;
driver->MajorFunction[IRP_MJ_CLEANUP] = MyCleanUp;
return 0;
}
测试驱动启动成功:
测试应用程序源码
MyDriverR3
// MyDriverR3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<Windows.h>
#include"stdlib.h"
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hdevice = NULL;
hdevice = CreateFile("\\\\.\\MyFirstDevice", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
//== INVALID_HANDLE_VALUE
if (!hdevice )
{
printf("Open Device Faile\n");
system("pause");
// return 0;
}
printf("Open Success\n");
system("pause");
CloseHandle(hdevice);
system("pause");
return 0;
}
配置属性:
测试调用自写驱动: