我是靠谱客的博主 危机毛衣,最近开发中收集的这篇文章主要介绍驱动入门 R3与R0的通信,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 哇 这一段时间是很自闭的 主要的原因还是因为我们老师还有学长给我了一道Linux逆向题 我死活都不会做。。。凉凉

 

然后 我就继续学习驱动了 然后根据一些学习资料 写了一下驱动程序与应用层的程序的通信 大概就是缓冲区的方法  然后 因为虚拟机里面没有安装vs 我就用codeblocks写的 但是发现 报错了 后来百度了一下 发现定义了一下 UNCODE就可以了  然后就成了 

R0代码:

 

#include <ntddk.h>
#define DEVICE_OBJECT_NAME  L"\Device\BufferedIODeviceObjectName"
#define DEVICE_LINK_NAME    L"\DosDevices\BufferedIODevcieLinkName"
void dirver(IN PDRIVER_OBJECT pDriveObject)
{
	KdPrint(("驱动已经卸载!n"));
	DbgPrint("卸载成功!\n");
}
NTSTATUS pass(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
	pIrp->IoStatus.Status = STATUS_SUCCESS;
	pIrp->IoStatus.Information = 0;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return STATUS_SUCCESS;
}
NTSTATUS Read(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
	KdPrint(("程序已经开始运行!n"));
	NTSTATUS flag = STATUS_SUCCESS;
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
	ULONG u_len = stack->Parameters.Read.Length;
	pIrp->IoStatus.Status = flag;
	pIrp->IoStatus.Information = u_len;
	memset(pIrp->AssociatedIrp.SystemBuffer, 0xAA, u_len);;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	KdPrint(("程序已经结束n"));
	return flag;

}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriveObject, IN PUNICODE_STRING RegisterPath)
{
	PDEVICE_OBJECT DeviceObject = NULL;
	UNICODE_STRING  DeviceObjectName;
	UNICODE_STRING  DeviceObjectLink;
	NTSTATUS flag = STATUS_SUCCESS;
	RtlInitUnicodeString(&DeviceObjectName, DEVICE_OBJECT_NAME);
	flag = IoCreateDevice(DriveObject, 0,
		&DeviceObjectName,
		FILE_DEVICE_UNKNOWN,
		0,
		FALSE,
		&DeviceObject);
	if (!NT_SUCCESS(flag))
	{

		return flag;
	}
	DeviceObject->Flags |= DO_DIRECT_IO;
	RtlInitUnicodeString(&DeviceObjectLink, DEVICE_LINK_NAME);
	flag = IoCreateSymbolicLink(&DeviceObjectLink, &DeviceObjectName);
	if (!NT_SUCCESS(flag))
	{
		IoDeleteDevice(DeviceObject);
	}
	for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
	{
		DriveObject->MajorFunction[i] = pass;
	}
	DriveObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Read;
	DriveObject->DriverUnload = dirver;
	return STATUS_SUCCESS;

}

R3 代码

#define UNICODE
#include<stdio.h>
#include<math.h>
#include<string.h>
#include <windows.h>
#define DEVICE_LINK_NAME    L"\\.\BufferedIODevcieLinkName"
int main()
{
    HANDLE h=CreateFile(DEVICE_LINK_NAME,
                        GENERIC_READ|GENERIC_WRITE,
                        0,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
    if(h==INVALID_HANDLE_VALUE)
    {
        printf("file:%s with error code %dn","DIVE",GetLastError());
        system("pause");
        return 1;
    }
    UCHAR buffer[10];
    ULONG ulRead;
    bool bRet=ReadFile(h,buffer,10,&ulRead,NULL);
    if(bRet)
    {
        printf("Read %d bytes:",ulRead);
        for(int i=0;i<(int)ulRead;i++)
        {
             printf("%02x",buffer[i]);
        }
        printf("n");
    }
    CloseHandle(h);
    system("pause");
    return 0;
}

 

最后

以上就是危机毛衣为你收集整理的驱动入门 R3与R0的通信的全部内容,希望文章能够帮你解决驱动入门 R3与R0的通信所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部