我有一个驱动程序代码,在32位上效果很好。在64位我编译它,并且数字签名它。驱动程序加载但无法正常工作。驱动程序的主要功能是在回拨过程中将程序创建和终止注册到我的程序中。所以我有两个IOCTL工作。该代码如下..驱动程序64位
NTSTATUS DispatchIoctl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
PDEVICE_EXTENSION extension = DeviceObject->DeviceExtension;
PPROCESS_CALLBACK_INFO pProcCallbackInfo;
//
// These IOCTL handlers are the set and get interfaces between
// the driver and the user mode app
//
switch(irpStack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_PROCOBSRV_ACTIVATE_MONITORING:
{
ntStatus = ActivateMonitoringHanlder(Irp);
break;
}
case IOCTL_PROCOBSRV_GET_PROCINFO:
{
if (irpStack->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(PROCESS_CALLBACK_INFO))
{
pProcCallbackInfo = Irp->AssociatedIrp.SystemBuffer;
pProcCallbackInfo->hParentId = extension->hParentId;
pProcCallbackInfo->hProcessId = extension->hProcessId;
pProcCallbackInfo->bCreate = extension->bCreate;
ntStatus = STATUS_SUCCESS;
}
break;
}
default:
break;
}
Irp->IoStatus.Status = ntStatus;
//
// Set number of bytes to copy back to user-mode
//
if(ntStatus == STATUS_SUCCESS)
Irp->IoStatus.Information = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
else
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
}
当我打电话
bReturnCode = ::DeviceIoControl(
hDriverFile,
IOCTL_PROCOBSRV_ACTIVATE_MONITORING,
&activateInfo,
sizeof(activateInfo),
NULL,
0,
&dwBytesReturned,
NULL
);
的代码是否能够成功,但是当我打电话
bReturnCode = ::DeviceIoControl(
m_hDriverFile,
IOCTL_PROCOBSRV_GET_PROCINFO,
0,
0,
&callbackInfo, sizeof(callbackInfo),
&dwBytesReturned,
&ov
);
GetLastError返回31.谁能帮助我与此。这是64位IOCTL结构的问题吗?请帮我找到解决办法。谢谢..
您的帖子中没有包含足够的信息来解决这个问题。调试驱动程序,看看里面发生了什么。或者将KdPrint语句添加到驱动程序,执行它并在DbgView程序中查看调试输出。 –
好吧..我是新来的司机...你能帮我告诉我如何调试驱动程序? – Neha
看看这个MSDN部分,它可能会帮助:[驱动程序开发工具](http://msdn.microsoft.com/en-us/library/ff545440(v = VS.85).aspx),特别是 - “调试驱动程序的工具“和”验证驱动程序的工具“。 – Eugene