当前位置: 代码迷 >> 驱动开发 >> DeviceIoControl 设备参数异常的有关问题
  详细解决方案

DeviceIoControl 设备参数异常的有关问题

热度:213   发布时间:2016-04-28 11:03:53.0
DeviceIoControl 设备参数错误的问题
本人不懂 驱动核心编程 网上下了一个 sys文件 还有源代码 用的是 DeviceIoControl 来和应用层通信


但是 DeviceIoControl 每次都说参数不正确 


代码如下
OpenDevice(g_szDriverName,&hDevice); 这个函数显示成功的,hDevice也有值 

success = DeviceIoControl(hDevice, 
IO_INSERT_HIDE_PROCESS,
(void*)&dwProcessId,
4,
NULL,
0,
&d_bytesRead,
NULL);
 
DeviceIoControlDispatcher(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp) 这个好像是分发函数 用来处理消息

代码如下 
NTSTATUS rtStatus;

ULONG uPID;
ULONG uInLen;
ULONG uOutLen;
ULONG uCtrlCode;

PCHAR pInBuffer;

PIO_STACK_LOCATION pStack;

uPID = 0;
rtStatus = STATUS_SUCCESS;
pStack = IoGetCurrentIrpStackLocation(pIrp);

uInLen = pStack->Parameters.DeviceIoControl.InputBufferLength;
uOutLen = pStack->Parameters.DeviceIoControl.OutputBufferLength;
uCtrlCode = pStack->Parameters.DeviceIoControl.IoControlCode;

//使用缓冲区方式与应用程序进行通信
pInBuffer = (PCHAR)pIrp->AssociatedIrp.SystemBuffer;

if(uInLen >= 4)
{
//stdlib.h(atol = Array To LONG)
uPID = atol(pInBuffer);

switch(uCtrlCode)
{
case IO_INSERT_PROTECT_PROCESS:
{
if(InsertProtectProcess(uPID) == FALSE)
{
rtStatus = STATUS_PROCESS_IS_TERMINATING;
}
break;
}
  default:
{
rtStatus = STATUS_INVALID_VARIANT;
break;
}
  }
  }
  else
{
rtStatus = STATUS_INVALID_PARAMETER;
}
  //输出信息总是为空,即该驱动程序不返回输出信息
pIrp->IoStatus.Status = rtStatus;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);

不知道 是什么原因 还有一个小问题 我现在CreateFile 用的是绝对路径 但是驱动好像有符号链接了 


#define DEVICE_NAME_PROCESS L"\\Device\\SSDT01ByZachary"
#define SYMBOLINK_NAME_PROCESS L"\\??\\SSDT01ByZachary"


RtlInitUnicodeString(&strDeviceName, DEVICE_NAME_PROCESS);
RtlInitUnicodeString(&strSymbolLinkName, SYMBOLINK_NAME_PROCESS);


status = IoCreateDevice(pDriverObject, 0, &strDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObject);
if (!NT_SUCCESS(status))
{
return status;
}
这里是什么意思 我把生的SYS文件改名了 而且我安装服务的时候的名字也和strDeviceName 不一样 这个有关系吗


StartServer 是成功的 而且我也确实看到启动了 这个和 DriverEntry 返回失败有关系吗?

不好意思 问题有点多 但是有点急 没办法去学习了 大家帮帮忙吧!

------解决方案--------------------
注意参数类型