Добрый день, форумчане. Взял шаблонный минифильтр из WDK, удалил лишнее, собрал. Запускается, успешно регистрируется в системе, но ничего не фильтрует. Каллбэки не вызываются. Тестирую на Win 7. Сам код: https://hastebin.com/halapowiqi.c И результат - нет ответа от FsFilterLoad: В чём тут дело?
Мож фаер или есентиал лочит? FsFilterUnload почему вызывается? Кстати, может не в тему - даю линк на ProcessExplorer когда то мной переделаный, там есть опции загрузки/выгрузки дров/длл, инжект длл, показ hide dll и много чего лишнего. Только под х86 пашет. https://www.sendspace.com/file/xyx6ki Password: 6daDWv4P
HoShiMin, Почему выгружается ? https://docs.microsoft.com/en-us/wi...en-the-filterunloadcallback-routine-is-called Можно ведь отключить выгрузку, посмотреть будут ли вызываться колбеки.
Версия SDK может повлиять? Собираю в VS2015 на SDK 10.0.15063.0, в Driver Settings -> General -> Target OS Version выставил Windows 7. Старый SDK (от 8.1) не хочет работать с новым WDK, поэтому SDK от 1703го билда десятки. Имеет значение?
Как есть. Забыл в inf-файле заполнить поля с альтитудой и Load Order Group. Заполнил - всё заработало.
Рабочий проект. Открыть, скомпилировать и запустить (ПКМ по *.inf -> Установить, затем в командной строке "net start fsfilter").
вот вы туда же да не нужен никаой inf все решаемо просто ну тут кусок, потом статейку дам с сорцами, сорри щас не могу, могу солюшен закинуть но позже Код (Text): DWORD WINAPI LoadDriver(LPVOID) { WCHAR strInjDll[MAX_PATH*2*sizeof(WCHAR)]={0}; static OPENFILENAMEW of; of.lStructSize=OPENFILENAME_SIZE_VERSION_400A; of.hwndOwner=HWMain; of.hInstance=hcm; of.lpstrCustomFilter=NULL; of.lpstrFilter=L"Driver files (*.sys)\0*.sys\0"; of.nMaxCustFilter=0; of.nFilterIndex=1; of.nMaxFile=MAX_PATH*2; of.lpstrFile=strInjDll; of.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; of.lpstrInitialDir=NULL; of.lpstrFileTitle=NULL; of.nMaxFileTitle=0; of.lpstrTitle =L"Select Driver for Load. Copyright©2009-2011 sysenter (JID: sysenter@jabber.no)"; if(GetOpenFileNameW(&of)) { UNICODE_STRING us; WCHAR* drivn=wcsrchr(strInjDll,'\\')+1; WCHAR* dot=wcsrchr(strInjDll,'.'); WCHAR serv[MAX_PATH]; wcscpy(serv,drivn); serv[dot-drivn]=0; WCHAR regp[MAX_PATH*20]={0}; wcscpy(regp,reg); wcscat(regp,serv); RtlInitUnicodeString(&us,regp); OBJECT_ATTRIBUTES OA; UNICODE_STRING ValueName,nPath; ULONG Disposition; HANDLE KeyHandle; RtlInitUnicodeString(&ValueName,regp); InitializeObjectAttributes(&OA, &ValueName,OBJ_CASE_INSENSITIVE,NULL,NULL); if(NT_SUCCESS(NtCreateKey(&KeyHandle,KEY_ALL_ACCESS,&OA,0,NULL,REG_OPTION_NON_VOLATILE,&Disposition ))) { RtlInitUnicodeString(&ValueName,L"ImagePath"); RtlDosPathNameToNtPathName_U(strInjDll,&nPath,NULL,NULL); //MessageBoxW(NULL,nPath.Buffer,strInjDll,0); if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_EXPAND_SZ,nPath.Buffer,nPath.Length+sizeof(WCHAR)))) { RtlInitUnicodeString(&ValueName,L"Type"); DWORD type=1; if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_DWORD,&type,sizeof(DWORD)))) { NtClose(KeyHandle); NTSTATUS st; st=NtLoadDriver(&us); if(NT_SUCCESS(st)) { Beep(2500,20); //Для дебилов } else { ResetError(st,"Error:NtLoadDriver"); } return 0; } else ResetError(0,"Error:NtSetValueKey (subkey)"); } else ResetError(0,"Error:NtSetValueKey"); NtClose(KeyHandle); } else ResetError(0,"Error:NtCreateKey"); } return 0; } //************************************************************************************************** // DWORD WINAPI LoadDriverX(LPVOID lpvParam) { WCHAR* strI=(WCHAR*)lpvParam; //MessageBoxW(NULL,strI,0,0); UNICODE_STRING us; WCHAR* drivn=wcsrchr(strI,'\\')+1; WCHAR* dot=wcsrchr(strI,'.'); WCHAR serv[MAX_PATH]; wcscpy(serv,drivn); serv[dot-drivn]=0; WCHAR regp[MAX_PATH*20]={0}; wcscpy(regp,regD); RtlInitUnicodeString(&us,regp); OBJECT_ATTRIBUTES OA; UNICODE_STRING ValueName,nPath; ULONG Disposition; HANDLE KeyHandle; RtlInitUnicodeString(&ValueName,regp); InitializeObjectAttributes(&OA, &ValueName,OBJ_CASE_INSENSITIVE,NULL,NULL); if(NT_SUCCESS(NtCreateKey(&KeyHandle,KEY_ALL_ACCESS,&OA,0,NULL,REG_OPTION_NON_VOLATILE,&Disposition ))) { RtlInitUnicodeString(&ValueName,L"ImagePath"); RtlDosPathNameToNtPathName_U(strI,&nPath,NULL,NULL); if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_EXPAND_SZ,nPath.Buffer,nPath.Length+sizeof(WCHAR)))) { RtlInitUnicodeString(&ValueName,L"Type"); DWORD type=1; if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_DWORD,&type,sizeof(DWORD)))) { NTSTATUS st; st=NtLoadDriver(&us); if(NT_SUCCESS(st)) { return (DWORD)KeyHandle; } NtClose(KeyHandle); return NULL; } } NtClose(KeyHandle); } return NULL; } //================================================================================================= ///////////////////////////////////////////////////////////////////////////////////////////////////////// DWORD WINAPI UnLoadDriver(LPVOID) { UNICODE_STRING us; //MessageBox(NULL,strNameDll,0,0); *strchr(strNameDll,'.')=0; wchar_t serv[512] ={0}; mbstowcs(serv,strNameDll, sizeof(serv)-1); WCHAR regp[MAX_PATH*20]={0}; wcscpy(regp,reg); wcscat(regp,serv); RtlInitUnicodeString(&us,regp); NTSTATUS st; st=NtUnloadDriver(&us); if(NT_SUCCESS(st)) { Beep(2500,20); } else { ResetError(st,"Error:NtUnLoadDriver"); } return 0; } inline BOOL EnableLoadDriverPrivilege(BOOL fEnable) { BOOL fOk = FALSE; HANDLE hToken; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,&hToken)) { TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; LookupPrivilegeValue(NULL, SE_LOAD_DRIVER_NAME, &tp.Privileges[0].Luid); tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); fOk = (GetLastError() == ERROR_SUCCESS); CloseHandle(hToken); } return(fOk); } ///////////////////////////////////////////////////////////////////////////////////////////////////////// DWORD WINAPI UnLoadDriverX(LPVOID lpvA) { char sz_ex[24]={0}; strcpy(sz_ex,(char*)lpvA); UNICODE_STRING us; *strchr(sz_ex,'.')=0; wchar_t serv[512] ={0}; mbstowcs(serv,sz_ex, sizeof(serv)-1); WCHAR regp[MAX_PATH*20]={0}; wcscpy(regp,regD); wcscat(regp,serv); RtlInitUnicodeString(&us,regD); NTSTATUS st; st=NtUnloadDriver(&us); if(NT_SUCCESS(st)) { Beep(2500,20); } else { //ResetError(st,"Error:NtUnLoadDriver"); } return 0; }
это от ProcessExplorer+ кусок юзайте и вкуривайте мож плюсанет ктото, что на данном форуме хоть кто то начал выкладывать сорцы а не куски недоработок
RET, Загрузка драйверов происходит через реестр, это известный механизм. В данном случае не ясно почему не происходит нотификация, а сам дров загружается и апи успешно выполняются. Видимо что бы понять суть нужно разбирать механизм фильтров, его реализацию.