概述
哇 这一段时间是很自闭的 主要的原因还是因为我们老师还有学长给我了一道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的通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复