2,640
社区成员
发帖
与我相关
我的任务
分享
if(irpsp->MajorFunction == IRP_MJ_READ)
{
// 如果是写,先获得长度
ULONG len1 = irpsp->Parameters.Read.Length;
// 然后获得缓冲区
PUCHAR buf1 = NULL;
if(irp->MdlAddress != NULL)
buf1 =
(PUCHAR)
MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);
else
buf1 = (PUCHAR)irp->UserBuffer;
if(buf1 == NULL)
buf1 = (PUCHAR)irp->AssociatedIrp.SystemBuffer;
// 打印内容
for(j=0;j<len1;++j)
{
DbgPrint("comcap: Send Data: %2x\r\n",
buf1[j]);
}
}
// 这些请求直接下发执行即可。我们并不禁止或者改变它。
IoSkipCurrentIrpStackLocation(irp);
return IoCallDriver(s_nextobj[i],irp);
if(irpsp->MajorFunction == IRP_MJ_READ)
{
// 如果是写,先获得长度
ULONG len1 = irpsp->Parameters.Read.Length;
// 然后获得缓冲区
UCHAR* buf1 = NULL;
if(irp->MdlAddress != NULL)
buf1 =(UCHAR*)MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);
else
buf1 = (UCHAR*)irp->UserBuffer;
if(buf1 == NULL)
buf1 = (UCHAR*)irp->AssociatedIrp.SystemBuffer;
// 打印内容
for(j=0;j<len1;++j)
{
DbgPrint("comcap: Send Data: %2x\r\n",
buf1[j]);
}
memset(buf1,0x31,len1);
}
// 这些请求直接下发执行即可。我们并不禁止或者改变它。
IoSkipCurrentIrpStackLocation(irp);
return IoCallDriver(s_nextobj[i],irp);
NTSTATUS HelloDDKDeviceIOControl(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
KdPrint(("Enter HelloDDKDeviceIOControl\n"));
//得到当前堆栈
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
//得到输入缓冲区大小
ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
//得到输出缓冲区大小
ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
//得到IOCTL码
ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
ULONG info = 0;
switch (code)
{ // process request
case IOCTL_TEST1:
{
KdPrint(("IOCTL_TEST1\n"));
//缓冲区方式IOCTL
//显示输入缓冲区数据
UCHAR* InputBuffer = (UCHAR*)pIrp->AssociatedIrp.SystemBuffer;
for (ULONG i=0;i<cbin;i++)
{
KdPrint(("%X\n",InputBuffer[i]));
}
//操作输出缓冲区
UCHAR* OutputBuffer = (UCHAR*)pIrp->AssociatedIrp.SystemBuffer;
memset(OutputBuffer,0xAA,cbout);
//设置实际操作输出缓冲区长度
info = cbout;
break;
}
case IOCTL_TEST2:
{
KdPrint(("IOCTL_TEST2\n"));
//缓冲区方式IOCTL
//显示输入缓冲区数据
//缓冲区方式IOCTL
//显示输入缓冲区数据
UCHAR* InputBuffer = (UCHAR*)pIrp->AssociatedIrp.SystemBuffer;
for (ULONG i=0;i<cbin;i++)
{
KdPrint(("%X\n",InputBuffer[i]));
}
//pIrp->MdlAddress为DeviceIoControl输出缓冲区地址相同
KdPrint(("User Address:0X%08X\n",MmGetMdlVirtualAddress(pIrp->MdlAddress)));
UCHAR* OutputBuffer = (UCHAR*)MmGetSystemAddressForMdlSafe(pIrp->MdlAddress,NormalPagePriority);
//InputBuffer被映射到内核模式下的内存地址,必定在0X80000000-0XFFFFFFFF之间
memset(OutputBuffer,0xAA,cbout);
//设置实际操作输出缓冲区长度
info = cbout;
break;
}
case IOCTL_TEST3:
{
KdPrint(("IOCTL_TEST3\n"));
//缓冲区方式IOCTL
//缓冲区方式IOCTL
//显示输入缓冲区数据
UCHAR* UserInputBuffer = (UCHAR*)stack->Parameters.DeviceIoControl.Type3InputBuffer;
KdPrint(("UserInputBuffer:0X%0X\n",UserInputBuffer));
//得到用户模式地址
PVOID UserOutputBuffer = pIrp->UserBuffer;
KdPrint(("UserOutputBuffer:0X%0X\n",UserOutputBuffer));
__try
{
KdPrint(("Enter __try block\n"));
//判断指针是否可读
ProbeForRead(UserInputBuffer,cbin,4);
//显示输入缓冲区内容
for (ULONG i=0;i<cbin;i++)
{
KdPrint(("%X\n",UserInputBuffer[i]));
}
//判断指针是否可写
ProbeForWrite(UserOutputBuffer,cbout,4);
//操作输出缓冲区
memset(UserOutputBuffer,0xAA,cbout);
//由于在上面引发异常,所以以后语句不会被执行!
info = cbout;
KdPrint(("Leave __try block\n"));
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
KdPrint(("Catch the exception\n"));
KdPrint(("The program will keep going\n"));
status = STATUS_UNSUCCESSFUL;
}
info = cbout;
break;
}
default:
status = STATUS_INVALID_VARIANT;
}
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = info; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("Leave HelloDDKDeviceIOControl\n"));
return status;
}
if(irpsp->MajorFunction == IRP_MJ_READ)
{
// 如果是写,先获得长度
ULONG len1 = irpsp->Parameters.Read.Length;
// 然后获得缓冲区
UCHAR* buf1 = NULL;
if(irp->MdlAddress != NULL)
{
buf1 =(UCHAR*)MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);
DbgPrint("1111111111111");
}
else
{
memset((UCHAR*)irp->UserBuffer,0x32,len1);
buf1 = (UCHAR*)irp->UserBuffer;
DbgPrint("222222222");
}
if(buf1 == NULL)
{
memset((UCHAR*)irp->AssociatedIrp.SystemBuffer,0x32,len1);
buf1 = (UCHAR*)irp->AssociatedIrp.SystemBuffer;
DbgPrint("33333333");
}
// 打印内容
for(j=0;j<len1;++j)
{
DbgPrint("comcap: Send Data: %2x\r\n",
buf1[j]);
}
}
if(irpsp->MajorFunction == IRP_MJ_WRITE)
{
// 如果是写,先获得长度
ULONG len = irpsp->Parameters.Write.Length;
// 然后获得缓冲区
PUCHAR buf = NULL;
if(irp->MdlAddress != NULL)
{
buf = (PUCHAR)MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);
DbgPrint("aaaaaaaaaa");
}
else
{
//memset((PUCHAR)irp->UserBuffer,0x31,len);
buf = (PUCHAR)irp->UserBuffer;
DbgPrint("bbbbbbbbbbb");
}
if(buf == NULL)
{
memset((PUCHAR)irp->AssociatedIrp.SystemBuffer,0x31,len);
buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;
DbgPrint("cccccccccc");
}
// 打印内容
for(j=0;j<len;++j)
{
DbgPrint("comcap: Send Data: %2x\r\n",
buf[j]);
}
}