无法阻止司机 [英] can not stop a driver

查看:67
本文介绍了无法阻止司机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我很抱歉我的英语不太好。我会试着描述一下我的问题。



我写一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆