我有一個驅動程序代碼,在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