matrix2009
驱动牛犊
驱动牛犊
  • 注册日期2009-09-01
  • 最后登录2011-07-25
  • 粉丝0
  • 关注1
  • 积分20分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2930回复:2

用CreateFile打开过滤驱动失败,这是怎么回事?

楼主#
更多 发布于:2010-04-26 16:40
做了一个U盘过滤驱动,需要用DeviceIoControl和过滤驱动通信,在MFC exe程序中可以使用CreateFile打开并使用DeviceIoControl与过滤驱动通信。

  但是在一个dll中却无法使用CreateFile打开驱动,我用GetLastError和FormatMessage跟踪,没有报错,说是操作成功完成,估计是权限不够吧。


  但是过滤驱动的DriverEntry函数中,已经加了降低权限的代码,不知道为什么还是打不开?向大家请教

#define USBFILTER_SYSDEVICE_NAME L"\\Device\\HTUsbFilter"
#define USBFILTER_DOSDEVICE_NAME L"\\DosDevices\\HTUsbFilter"

#pragma INITCODE  
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
MyDriverObject = DriverObject;
// create control device object
  RtlInitUnicodeString(&DeviceName, USBFILTER_SYSDEVICE_NAME);
NtStatus = IoCreateDevice(DriverObject,  
0,  
&DeviceName,
FILE_DEVICE_DISK,  
0,
FALSE,
&MyControlDeviceObject);
if (!NT_SUCCESS(NtStatus))
{
KdPrint((DRIVERNAME " - IoCreateDevice failed - %X\n", NtStatus));
return NtStatus;
}

NtStatus = ObOpenObjectByPointer(MyControlDeviceObject,
0,
NULL,
FILE_ALL_ACCESS,
NULL,KernelMode,
&CtlDevHandle);
if(!NT_SUCCESS(NtStatus))  
{

return NtStatus;
}
ObDereferenceObject(MyControlDeviceObject);
SecurityDescriptor = (PSECURITY_DESCRIPTOR)ExAllocatePool(NonPagedPool,sizeof(SECURITY_DESCRIPTOR));
NtStatus = RtlCreateSecurityDescriptor(SecurityDescriptor,SECURITY_DESCRIPTOR_REVISION);
if(!NT_SUCCESS(NtStatus))  
{
KdPrint((DRIVERNAME " - Entering DriverEntry: DriverObject %8.8lX\n", DriverObject));
return NtStatus;
}
NtStatus = NtSetSecurityObject(CtlDevHandle,DACL_SECURITY_INFORMATION,SecurityDescriptor);
if(!NT_SUCCESS(NtStatus))  
{
return NtStatus;
}
ZwClose(CtlDevHandle);

// create symbol Link
  RtlInitUnicodeString(&SymLinkName, USBFILTER_DOSDEVICE_NAME);
NtStatus = IoCreateSymbolicLink(&SymLinkName, &DeviceName);
if (!NT_SUCCESS(NtStatus))  
{
KdPrint((DRIVERNAME " - IoCreateSymbolicLink failed - %X\n", NtStatus));
IoDeleteDevice(MyControlDeviceObject);
return NtStatus;
}
  。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
return STATUS_SUCCESS;
} // DriverEntry


dll中的相关代码:
 
#define HTUSBFILTER_NAME "\\\\.\\HTUsbFilter"
BOOL SendKeyUsernameToUsbfilter(char* Username,int len)
{
  BOOL bStatus;
DWORD dwRet;
int buflen = len;
char keyUsername[64] = {0};
HANDLE hHTUSBFILTERDevice = INVALID_HANDLE_VALUE;//scott

memcpy(keyUsername,Username,len);

//add notification to USBFILTER
hHTUSBFILTERDevice = CreateFile(HTUSBFILTER_NAME,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);

if(hHTIPSECDevice != INVALID_HANDLE_VALUE)  
{
bStatus = DeviceIoControl(hHTUSBFILTERDevice,
IOCTL_USBFILTER_GET_USERNAME,
keyUsername,  
buflen,  
  NULL,
  0,
&dwRet,
  NULL);
CloseHandle( hHTUSBFILTERDevice );
if (!bStatus)
{
MessageBox(NULL,"通知U盘过滤驱动失败-DeviceIoControl!","SendKeyUsernameToUsbfilter",0);
}
MessageBox(NULL,"通知U盘过滤驱动成功!","SendKeyUsernameToUsbfilter",0);
}
else
{
// DWORD nErrorNo = GetLastError ( ); // 得到错误代码
// LPSTR lpBuffer;  
// FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER |  
// FORMAT_MESSAGE_IGNORE_INSERTS |  
// FORMAT_MESSAGE_FROM_SYSTEM,
// NULL,
// nErrorNo, // 此乃错误代码,通常在程序中可由 GetLastError()得之
// LANG_NEUTRAL,
// (LPTSTR) & lpBuffer,
// 0 ,
// NULL );
// MessageBox(NULL,lpBuffer,0,0);
// LocalFree (lpBuffer);  
MessageBox(NULL,"打开U盘过滤驱动失败-CreateFile!","SendKeyUsernameToUsbfilter",0);
return FALSE;
}

return TRUE;

}

MFC程序是没有问题的,CreateFile和DeviceIoControl也是没有问题的。
在dll里和文件过滤驱动通信时,CreateFile和DeviceIoControl是没有问题的。

说实话,那个dll是一个Gina.dll,用来进行登录用的。


matrix2009
驱动牛犊
驱动牛犊
  • 注册日期2009-09-01
  • 最后登录2011-07-25
  • 粉丝0
  • 关注1
  • 积分20分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-04-26 16:43
我的这个驱动程序是一个磁盘驱动器的下层过滤驱动,挂载在注册表{4D36E967-E325-11CE-BFC1-08002BE10318}下的lowerFilters,
在IRP_MJ_PNP的派遣函数里处理U盘插入和拔出。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-04-26 17:45
1、使用平台是XP,VISTA还是WINDOW 7。
2、错误代码是多少。
3、检查IRP_MJ_CREATE是否处理正确。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部