驱动实验二(实现物理设备基本交互)

驱动源码

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;
}

配置属性:
在这里插入图片描述
在这里插入图片描述测试调用自写驱动:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值