驱动层和r3程序通讯的列子参考爱写驱动的女装大佬

开发环境:VS2013+WDK8.1

驱动层服务层:

#include <ntddk.h>

#define	 DEVICE_NAME "\\Device\\MyReadDevice"
#define  SYM_LINK_NAME	"\\??\\MyRead"

NTSTATUS DriverUnload(PDRIVER_OBJECT driver)
{
	DbgPrint("unload me");
	return STATUS_SUCCESS;
}

NTSTATUS MyDriverRead(PDEVICE_OBJECT device,PIRP pirp)
{
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pirp);
	ULONG	readLength = stack->Parameters.Read.Length;
	pirp->IoStatus.Status = STATUS_SUCCESS;
	pirp->IoStatus.Information = readLength;
	memset(pirp->AssociatedIrp.SystemBuffer, 0x90, readLength);
	IoCompleteRequest(pirp, IO_NO_INCREMENT);
	DbgPrint("ReadOver\n");
	return STATUS_SUCCESS;
}

NTSTATUS MyDriverCreate(PDEVICE_OBJECT device, PIRP pirp)
{

	pirp->IoStatus.Status = STATUS_SUCCESS;
	pirp->IoStatus.Information = 0;
	IoCompleteRequest(pirp, IO_NO_INCREMENT);
	DbgPrint("create device success\n");
	return STATUS_SUCCESS;
}
//NTSTATUS MyDriverWrite(PDEVICE_OBJECT device, PIRP pirp)
//{
//	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pirp);
//	ULONG	readLength = stack->Parameters.Read.Length;
//	pirp->IoStatus.Status = STATUS_SUCCESS;
//	pirp->IoStatus.Information = readLength;
//	memset(pirp->AssociatedIrp.SystemBuffer, 0x90, readLength);
//	IoCompleteRequest(pirp, IO_NO_INCREMENT);
//	DbgPrint("ReadOver\n");
//	return STATUS_SUCCESS;
//}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
	
	driver->MajorFunction[IRP_MJ_READ] = MyDriverRead;
	driver->MajorFunction[IRP_MJ_CREATE] = MyDriverCreate;
	driver->DriverUnload = DriverUnload;
	PDEVICE_OBJECT pDevice;
	UNICODE_STRING DeviceName;
	
	RtlInitUnicodeString(&DeviceName, L"\\Device\\MyReadDevice");
	NTSTATUS status = IoCreateDevice(driver, 0, &DeviceName,FILE_DEVICE_UNKNOWN,0,TRUE,&pDevice);
	if (!NT_SUCCESS(status)){
		DbgPrint("Create Device Failed\n");
		return STATUS_SUCCESS;
	}
	pDevice->Flags |= DO_BUFFERED_IO;
	DbgPrint("Crate Device Successfully!");
	UNICODE_STRING SymLinkName;
	RtlInitUnicodeString(&SymLinkName, L"\\??\\MyRead");
	status = IoCreateSymbolicLink(&SymLinkName, &DeviceName);
	if (!NT_SUCCESS(status)){
		DbgPrint("Create SymbolLink Failed\n");
		IoDeleteDevice(pDevice);
		return STATUS_SUCCESS;
	}
	
	
	return STATUS_SUCCESS;

}

r3客户端:

// R3Read.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{

	HANDLE	hDevice = CreateFile(L"\\\\.\\MyRead", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hDevice == INVALID_HANDLE_VALUE){
		printf("Failed to obtain file handle to Device");
		getchar();
		return 1;
	}
	UCHAR buffer[10];
	ULONG ulRead;
	BOOL  bRet = ReadFile(hDevice, buffer, 10, &ulRead, NULL);
	if (bRet){
		printf("Read %d bytes;\n", ulRead);
		for (int i = 0; i < ulRead; i++){
			printf("%02x", buffer[i]);
		}
	}
	getchar();
	return 0;
}

查看结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值