Hi,
I am writing file system minifilter in which my requirement is to detect USB pluggedIn for this in DriverEntry used “IoRegisterPlugPlayNotification” function to register callback function of USB detection.
/**************************Driver Entry*************************/
NTSTATUS
DriverEntry (
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath
)
{
PSECURITY_DESCRIPTOR sd;
OBJECT_ATTRIBUTES oa;
UNICODE_STRING uStrVolume,uStrPort;
PFILTER_VOLUME_BASIC_INFORMATION pFilterInfo = NULL;
PFLT_VOLUME pFLTVolume;
PVOID buffer = NULL;
NTSTATUS nStatus = STATUS_SUCCESS;
NTSTATUS nStatus2 = STATUS_SUCCESS;
LONG NumberofVolumes = 0,NumberofVolumes2 = 0;
int iLoop = 0;
PVOID _NotificationBuffer = NULL;
try
{
//RtlInitUnicodeString(&uStrVolume,L"D:");
WinFLTData.m_NameQueryMethod = DEFAULT_NAME_QUERY_METHOD;
WinFLTData.m_DriverObject = DriverObject;
nStatus = FltRegisterFilter(DriverObject,&FilterRegistration,&WinFLTData.m_Filter);
nStatus = FltBuildDefaultSecurityDescriptor( &sd,
FLT_PORT_ALL_ACCESS );
RtlInitUnicodeString( &uStrPort, WINFLT_PORT_NAME );
InitializeObjectAttributes( &oa,
&uStrPort,
OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
NULL,
sd );
nStatus = FltCreateCommunicationPort(WinFLTData.m_Filter,
&WinFLTData.m_ServerPort,
&oa,
NULL,
Flt_Connect,
Flt_Disconnect,
Flt_Message,
1 );
FltFreeSecurityDescriptor( sd );
PsGetVersion(&gMajOSVersion,&gMinOSVersion,NULL,NULL);
nStatus = FltStartFiltering( WinFLTData.m_Filter);
nStatus = FltEnumerateVolumes(WinFLTData.m_Filter,NULL,0,&NumberofVolumes);
buffer = ExAllocatePool(PagedPool,1024);
_NotificationBuffer = ExAllocatePool(PagedPool,1024);
if(buffer != NULL)
{
for(iLoop = 0; iLoop < NumberofVolumes; iLoop++)
{
nStatus = FltEnumerateVolumeInformation(WinFLTData.m_Filter,iLoop,FilterVolumeBasicInformation,buffer, 1024,&NumberofVolumes2);
pFilterInfo = (PFILTER_VOLUME_BASIC_INFORMATION)buffer;
uStrVolume.Length = (USHORT)pFilterInfo->FilterVolumeNameLength;
uStrVolume.MaximumLength = uStrVolume.Length;
uStrVolume.Buffer = &pFilterInfo->FilterVolumeName[0];
if(NT_SUCCESS(nStatus))
{
nStatus = FltGetVolumeFromName(WinFLTData.m_Filter,&uStrVolume,&pFLTVolume);
if(NT_SUCCESS(nStatus))
{
nStatus = FltAttachVolume(WinFLTData.m_Filter,pFLTVolume,NULL,NULL);
DbgPrint(“Attached Volume Successfully… \n”);
FltObjectDereference(pFLTVolume);
}
}
}
ExFreePool(buffer);
}
/************************************ Registration of Callback function ***/
nStatus2 = IoRegisterPlugPlayNotification
( EventCategoryDeviceInterfaceChange, PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, (PVOID)&GUID_DEVICE_INTERFACE_ARRIVAL, DriverObject, (PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)USB_PnpNotifyInterfaceChange,
(PVOID)“”,
(PVOID)&_NotificationBuffer
);
/************************************ Registration of Callback function ***/
DbgPrint(“Status Value…%d\n”,nStatus2);
ExFreePool(_NotificationBuffer);
}
finally
{
if (!NT_SUCCESS( nStatus ) ) {
if (NULL != WinFLTData.m_ServerPort) {
FltCloseCommunicationPort( WinFLTData.m_ServerPort);
}
if (NULL != WinFLTData.m_Filter) {
FltUnregisterFilter( WinFLTData.m_Filter);
}
}
}
DbgPrint(“Testing Driver started Successfully… \n”);
return nStatus;
}
/************************Callback definition ******************/
NTSTATUS
USB_PnpNotifyInterfaceChange(
__in PDEVICE_INTERFACE_CHANGE_NOTIFICATION NotificationStruct,
__in PVOID Context
)
{
DbgPrint(“USB Plugged In…\n”);
return STATUS_SUCCESS;
}
/************************Callback definition ******************/
Unfortunately USB pluggedIn event is not being detected. Plz let me know if any body trace the problem
Thanks