无法阻止司机 [英] can not stop a driver
本文介绍了无法阻止司机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
大家好,我很抱歉我的英语不太好。我会试着描述一下我的问题。
我写一个NT驱动程序是一个键盘滤波器。有时候,在某些电脑(不是我的电脑)上,不能停下来。当我使用nsSCM :: Stop / NOUNLOADMyFilter停止驱动程序,然后在CMD中查询MyFilter时,它总是停止。我不知道为什么。
hello everyone, I am so sorry that my English is not very well.i will try to describe my question.
I write a NT driver that is a keyboard filter. Sometimes, on some computers(not mine), can't be stop. when I use "nsSCM::Stop /NOUNLOAD "MyFilter"" to stop the driver, and then,"query MyFilter" in CMD, it is always "stop_pending".i don't know why.
VOID ClearPendingIrp(IN PDRIVER_OBJECT pDrvObj,IN BOOLEAN cancel)
{
PDEVICE_OBJECT pDevObj = pDrvObj->DeviceObject;
PDEVICE_EXTENSION pDevExt = NULL;
while (pDevObj)
{
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
if (pDevExt->et == et_normal)
{
if (cancel && pDevExt->pIrp)
{
BOOLEAN bCancel = IoCancelIrp(pDevExt->pIrp);
#ifdef DBG
KdPrint(("IoCancelIrp Result:%d\n",bCancel));
#endif
}
pDevExt->pIrp = NULL;
}
pDevObj = pDevObj->NextDevice;
}
}
VOID DetachDevices(IN PDEVICE_OBJECT pDevObj)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
__try
{
__try
{
if (pDevExt->et == et_filter)
{
PFILTER_DEVICE_EXTENSION pFilterExt = (PFILTER_DEVICE_EXTENSION)pDevExt;
IoDetachDevice(pFilterExt->pTargetDeviceObject);
if (pFilterExt->pIrp)
{
IoCancelIrp(pFilterExt->pIrp);
}
}
else if (pDevExt->et == et_normal)
{
if (pDevExt->pData)
{
ReleaseRecorder(pDevExt->pData);
}
}
else if (pDevExt->et == et_none)
{
PFILTER_DEVICE_EXTENSION pFilterExt = (PFILTER_DEVICE_EXTENSION)pDevExt;
IoDetachDevice(pFilterExt->pTargetDeviceObject);
}
IoDeleteDevice(pDevObj);
}
__except(EXCEPTION_EXECUTE_HANDLER){}
}
__finally{}
}
VOID DriverUnload(IN PDRIVER_OBJECT pDrvObj)
{
PDEVICE_OBJECT pDevObj = NULL;
PDEVICE_OBJECT pNextDevObj = NULL;
UNICODE_STRING ustrSymName = {0};
RtlInitUnicodeString(&ustrSymName,DOS_DEVICE_NAME_W);
IoDeleteSymbolicLink(&ustrSymName);
UNREFERENCED_PARAMETER(pDrvObj);
KdPrint(("Driver Unloading...\n"));
ClearPendingIrp(pDrvObj,TRUE);
KdPrint(("DriverUnload: ClearPendingIrp.\n"));
pDevObj = pDrvObj->DeviceObject;
KdPrint(("DriverUnload: Begin DetachDevices.\n"));
while (pDevObj)
{
pNextDevObj = pDevObj->NextDevice;
DetachDevices(pDevObj);
pDevObj = pNextDevObj;
}
KdPrint(("DriverUnload: End DetachDevices.\n"));
ASSERT(!pDrvObj->DeviceObject);
KdPrint(("Driver Unloaded.\n"));
}
...........
推荐答案
#include <stdio.h>
#include<string.h>
char f[10000];
char factorial[1010][10000];
void multiply(int k)
{
int cin,sum,i;
int len = strlen(f);
cin=0;
i=0;
while(i<len)
{
sum=cin+(f[i] - '0') * k;
f[i] = (sum % 10) + '0';
i++;
cin = sum/10;
}
while(cin>0)
{
f[i++] = (cin%10) + '0';
cin/=10;
}
f[i]='\0';
for(int j=0;j<i;j++)
factorial[k][j]=f[j];
factorial[k][i]='\0';
}
void fac()
{
int k;
strcpy(f,"1");
for(k=2;k<=1000;k++)
multiply(k);
}
void print(int n)
{
int i;
int len = strlen(factorial[n]);
printf("%d!\n",n);
for(i=len-1;i>=0;i--)
printf("%c",factorial[n][i]);
printf("\n");
}
int main()
{
int n;
factorial[0][0]='1';
factorial[1][0]='1';
fac();
while(scanf("%d",&n)==1){
print(n);
}
return 0;
}
这篇关于无法阻止司机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文