Ochkarik
|
|
« Ответ #60 : 14-12-2011 18:10 » |
|
Панель управления-Администрирование-Просмотр событий кажется в системных событиях должно все появляться, если не ошибаюсь. почитайте описание функций которые вы используются в GetMessage и про IO_ERROP_LOG_PACKET на MSDN. язык программирования роли не играет.
насчет остальных MJ_ функций - там так же все просто. поищите пример использования - их есть много в сети.
PS понимаете, писать за вас код, ну совсем желания нет) но если будете задавать ПРАВИЛЬНЫЕ вопросы, могу пнуть в нужном направлении. PPS не только правильные вопросы, но и хотя бы ваши попытки в них разобраться самостоятельно.
|
|
« Последнее редактирование: 14-12-2011 18:14 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #61 : 14-12-2011 19:57 » |
|
Про IoWriteErrorLogEntry на MSDN как-то непонятно написано, а в других местах она описывается как функция, которая выводит в log entry сообщение, то есть тот пакет, который ей передали в параметре. Панель управления-Администрирование-Просмотр событий Я знаю где находится log entry, вы мне это уже говорили в одном из предыдущих постов. На msdn про поле MajorFunctionCode говорится, что этот параметр не является обязательным, а обязателен как я понял параметр ErrorCode, он то и говорит Event Viewer'у тип ошибки, и Event Viewer понимает какие строки нужно вывести. насчет остальных MJ_ функций - там так же все просто. поищите пример использования - их есть много в сети. Что значит пример использования - это и есть часть моей программы, которая будет использовать драйвер? Я просто не могу понять, что мне искать. Так, бы я, может, уже и нашел кабы знал). для начала вам надо заполнить в драйвере свои обработчики MJ_CREATE/MJ_CLOSE которые отвечают за обработку вызовов CreateFIle/CloseHandle из приложения, MJ_CREATE, MJ_READ и MJ_WRITE у меня есть, что значит заполнить, у меня там вызывается функция GetMessage и всё... ну MJ_CREATE у меня еще IoCompleteRequest в msdn написано так: Когда драйвер закончил всю обработку для данного IRP, он вызывает IoCompleteRequest.
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
|
|
Ochkarik
|
|
« Ответ #64 : 15-12-2011 10:28 » |
|
самую последнюю ссылку смотрите. там все есть.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #65 : 16-12-2011 08:39 » |
|
Пытаюсь собрать это приложение из кусочков программ со ссылок, которые вы мне дали, но из-за моей неопытности в Visual C++ не могу исправить все ошибки, которые почему-то там возникают, может кто-нибудь посмотрит? Там было 50 ошибок сейчас 40. Еще 17 ошибок исправил, файл перезалил. там сейчас 50 ошибок, так как одну исправил (нужно было скобочку доставить)) и из-за этого еще 16 добавилось. Где взять файл error.h из-за него всё. PS Я наше про error_index здесь http://cctbx.sourceforge.net/current_cvs/c_plus_plus/classDistl_1_1scitbx_1_1error__index.html, там сверху один хидер - <scanbox.h> а снизу error.h не пойму, где он взял этот error_index. Его я даже на MSDN не могу найти.
|
|
« Последнее редактирование: 16-12-2011 09:58 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Fredwriter
|
|
« Ответ #66 : 16-12-2011 10:51 » |
|
Осталась одна ошибка я убрал функцию Error, и испавил свои мелкие ошибки, заливаю обновлённый
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #67 : 16-12-2011 11:28 » |
|
если речь про 1>c:\temp\usedriver\usedriver\usedriver.cpp(163) : error C2664: 'ControlService' : cannot convert parameter 3 from 'LPSERVICE_STATUS *' to 'LPSERVICE_STATUS' 1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
то это потому что третий, переданный параметр в функцию - не соответствует типу который понимает функция. функции нужен указатель, а вы двойной указатель передаете. надо SERVICE_STATUS ServiceStatus
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #68 : 16-12-2011 12:08 » |
|
исправил эту ошибку, появилось еще 8 Linking... UseDriver.obj : error LNK2019: unresolved external symbol __imp__OpenSCManagerA@12 referenced in function "bool __cdecl OpenManager(void)" (?OpenManager@@YA_NXZ) UseDriver.obj : error LNK2019: unresolved external symbol __imp__CloseServiceHandle@4 referenced in function "bool __cdecl OpenManager(void)" (?OpenManager@@YA_NXZ) UseDriver.obj : error LNK2019: unresolved external symbol __imp__CreateServiceA@52 referenced in function "bool __cdecl drvCreateService(char *)" (?drvCreateService@@YA_NPAD@Z) UseDriver.obj : error LNK2019: unresolved external symbol __imp__OpenServiceA@12 referenced in function "bool __cdecl drvOpenService(char *)" (?drvOpenService@@YA_NPAD@Z) UseDriver.obj : error LNK2019: unresolved external symbol __imp__StartServiceA@12 referenced in function "bool __cdecl drvStartService(char *)" (?drvStartService@@YA_NPAD@Z) UseDriver.obj : error LNK2019: unresolved external symbol __imp__DeleteService@4 referenced in function "bool __cdecl drvDeleteService(char *)" (?drvDeleteService@@YA_NPAD@Z) UseDriver.obj : error LNK2019: unresolved external symbol __imp__ControlService@12 referenced in function "int __cdecl drvUnLoad(char *)" (?drvUnLoad@@YAHPAD@Z) D:\Мои документы\Задания\ПО УЧЕБЕ\Операционные системы\UseDriver\Debug\UseDriver.exe : fatal error LNK1120: 7 unresolved externals Вот проект Всё, отмена, исправлено Для тех, кто столкнётся с подобной ошибкой: Project->Project Properties->Configuration Properties->Linker->Input->Additional Dependencies - поставил галку на Inherit from parent or project default
|
|
« Последнее редактирование: 16-12-2011 13:29 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #69 : 16-12-2011 13:29 » |
|
|
|
« Последнее редактирование: 16-12-2011 13:34 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #70 : 16-12-2011 14:01 » |
|
Ошибку я уже исправил, программа запускается без ошибок, открываю просмотр событий, там при каждом запуске программы одна и та же ошибка картинку выкладываю. Не понял это к чему?
|
|
« Последнее редактирование: 16-12-2011 14:04 от Ochkarik »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #71 : 16-12-2011 14:13 » |
|
хм. ошибка однако - видимо что то не.... проверяйте все, ищите что не так сделали. к прочтению соответствующего раздела документации.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #72 : 16-12-2011 14:19 » |
|
слушайте... а зачем вам программирование? может ну его нафиг)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #73 : 16-12-2011 16:58 » |
|
Нашел одну ошибку: GetCurrentDirectory(256, lpBuffer); strcat(lpBuffer,"\"); strcat(lpBuffer,pDrvName); awPath = lpBuffer; Так как знак "\" является одной из скобок языка, не получается прибавить его строке lpBuffer, а код не я писал, я его только переписал. Это прошло компиляцию, потому-что я, по невнимательности, когда выдало ошибку в этой строке, просто написал так: слушайте... а зачем вам программирование? может ну его нафиг) Прежде чем писать кому-то такое на форуме я бы тысячу раз подумал. Добавлено через 1 час, 23 минуты и 27 секунд:Почему-то сервис не создается, после прохода строки CreateServise(), hService не присваивается значение. Выложу, что у меня есть.
|
|
« Последнее редактирование: 16-12-2011 18:24 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #74 : 16-12-2011 19:04 » |
|
я подумал... я еще раз ваш код посмотрел.... типа этого куска например: bool OpenManager() { bool status; status=FALSE; if (hSCManager!=NULL) { CloseServiceHandle (hSCManager); hSCManager=NULL; } hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); status=TRUE;
return status; } и вы утверждаете что вы его по вашему выражению "переписали". переписывать можно тоже по разному. а далее я вижу проверку... и что по вашему делает это условие? проверяет что значение TRUE действительно равно TRUE? наверное это просто необходимое условие продолжения работы! следующая проверка if(drvCreateService(name)) { .... аналогично. продолжать?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #75 : 16-12-2011 19:10 » |
|
а код if (hSCManager!=NULL) { CloseServiceHandle (hSCManager); hSCManager=NULL; }
что по вашему делает? проверяет что хендел устройства (проинициализированный нулем в функции drvLoad() ) действительно не равен нулю?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #76 : 16-12-2011 19:15 » |
|
функция bool drvCreateService(PCHAR pDrvName) { LPTSTR lpBuffer; lpBuffer = new char[256]; bool status = FALSE; LPTSTR awPath; GetCurrentDirectory(256, lpBuffer); strcat(lpBuffer,"\\"); strcat(lpBuffer, pDrvName); awPath = lpBuffer;
hService = CreateService(hSCManager, pDrvName, pDrvName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, awPath, NULL, NULL, NULL, NULL, NULL);
status = drvOpenService(pDrvName);
delete lpBuffer; return status; } при том что drvOpenService() так же, всегда возвращает TRUE (как и все остальные написаннные по принципу функции OpenManager() ) что по вашему вернет? что то отличное от TRUE?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #77 : 16-12-2011 19:25 » |
|
а ошибка, могла быть из за включения Unicod-a в свойствах проекта, о чем еще страницу назад Dimka любопытствовал. если до этой строчки выполнение этого безобразия, вообще доходит... а может из за того что текущий каталог при выполнении программы не соответствует месту где драйвер лежит(в случае если код запускается из под отладчика). а может еще где опечатка... но это гадание на кофейной гуще. а компилировать и проверять, а тем более исправить самому это безобразие у меня даже желания не возникает. пардон... накипело.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #78 : 16-12-2011 19:41 » |
|
Я пошагово выполняю программу, клавишу F11, значит, нажимаю, то есть пошаговое выполнение с заходом в функцию, в функции OpenManager() так как hSCManager обычно таки NULL вызывается функция API hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS) и отрабатывет нормально ну хорошо, можно добавить вот это hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (hSCManager == NULL) printf("Netushki"); else status=TRUE; Обычно всё нормуль, то есть true. Затем стрелочка, как любая послушная стрелочка дебагера заходит в функцию drvCreateService(PCHAR pDrvName) и здесь то и подвох, не проходит создание сервиса почему-то. hService = CreateService(hSCManager, pDrvName, pDrvName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, awPath, NULL, NULL, NULL, NULL, NULL); if (hService == NULL) printf("Netushki"); else status = drvOpenService(pDrvName); Всегда нетушки. В чём проблема? PS a Unicode я давно уже отключил.
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #79 : 16-12-2011 19:45 » |
|
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682450(v=vs.85).aspxCreateService function ...... Return value If the function succeeds, the return value is a handle to the service. If the function fails, the return value is NULL. To get extended error information,call GetLastError. The following error codes can be set by the service control manager. Other error codes can be set by the registry functions that are called by the service control manager. список кодов по ссылке описания CreateService GetLastError function
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #80 : 16-12-2011 20:53 » |
|
GetLastError() сказал: "Указанная служба уже существует". Я, в этот момент вспомнил, что я уже установил драйвер с помощью reg - файла, и удалил его из устройств. Перезагрузил комп, убедился, что нет этого драйвера в устройствах, затем опять GetLastError() выдал эту же ошибку. Не пойму. Добавлено через 50 минут и 42 секунды:Всё, заработало вроде, пошли уведомления в логе от MyDriver.sys Выложу картинку и проект: Добавлено через 2 часа, 53 минуты и 46 секунд:Прогонял программу пошагово по F10 и после прохода каждой функции заглядывал в EventLog, так там появляется событие только после drvLoad, а после WriteFile ничего не появляется. Вот же ж ёж. PS То есть, только после открытия и запуска службы.
|
|
« Последнее редактирование: 17-12-2011 00:42 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Fredwriter
|
|
« Ответ #81 : 17-12-2011 01:25 » |
|
Всё с событиями разобрался коды выводит правильно, только EventLog почему-то не находит описание, но оно было в MyDriverMessages.h при сборке. Выложу картинку похвастаться:
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #82 : 17-12-2011 11:52 » |
|
|
|
« Последнее редактирование: 17-12-2011 11:56 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #83 : 17-12-2011 18:36 » |
|
С выводом описания сообщения так и не разобрался, но пока пытался разобраться, обнаружил еще куда более серьёзную проблему, у меня управляющая программа запускается только один раз, на следующий раз она вырубает компьютер! и он перезагружается. Дебагером бегал по коду и отслеживал после прохода каждой API функции вывод в лог, первый раз, после перезагрузки она выводит пять сообщений, одно от Service Control Menager, вложена картинка, и четыре от драйвера с кодами 1 - CreateService, 2 - OpenService, 3 - ReadFile, 4 - WriteFile. Второй раз выводит четыре сообщения, одно от Application Popup, какое-то пугающее - смотреть вложение, и три от драйвера с кодами 2, 3, 4. Буду смотреть Application Popup. Одну картинку первую перевложил Вложу еще проект, может кто-нибудь рискнёт на своём компе такое дебагером? Не могу почему-то выложить проект, размет моего архива 773 kb, выдаёт ошибку: Ваш файл слишком большой, максимальный размер вложения 2048 kb?
|
|
« Последнее редактирование: 17-12-2011 18:58 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #84 : 17-12-2011 18:55 » |
|
это не программа виновата. это драйвер глючит похоже. его отлаживайте. из программы комп завалить - это маловероятно.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #85 : 17-12-2011 20:43 » |
|
Я немного неправильно рассказал последовательность вывода сообщений у меня при первом запуске 6 сообщений, последнее это как раз от Application Popup, а при втором 3 и перезагрузка) Насчёт отладки драйвера это проблема никогда этого не делал, не расскажите каким отладчиком лучше пользоваться и как вы это сами делаете? PS я думаю это связано с этим сообщением Application Popup.
|
|
« Последнее редактирование: 17-12-2011 20:46 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #86 : 17-12-2011 21:30 » |
|
отладчиком... Syser или WinDBG.. мне первый больше нравится, хотя он иногда поглюкивает... вторым не пользовался, да и вообще привык без него обходится. но с ним наверное долго разбираться будете. попробуйте сначала обойтись отладочными сообщениями - как их ловить писал выше. (DbgView + DbgPrint в драйвере) вбейте в драйвер все возможные проверки всех невозможных ошибок как можно чаще, и ловите отладочные сообщения. BSOD вы конечно так не увидите, но тут скорее проблема в первом обращении к драйверу а не во втором. что то вы забыли деинициализировать наверное. или наоборот)
|
|
« Последнее редактирование: 17-12-2011 21:32 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #87 : 17-12-2011 21:40 » |
|
И всё таки, что это за блокированные страницы ввода-вывода? PS Спасибо за подсказку об отладке, попробую. Не могу понять как пользоваться DbgView. Подскажите пожалуйста. Добавлено через 3 часа, 11 минут и 44 секунды:Не знаю в правильном ли я направлении действовал, но в конце ничего не вышло, я понатыкал DbgView в исходнике драйвера, перебилдил его Buil'ом для Checked версии из DDK, и новый файл драйвера использовал при пошаговом проходе по моей использующей программе при открытом DbgView. Никаких сообщений при проходе в DbgView не вышло. Похоже что-то не то я делал. PS Может кто-нибудь посмотрит опытным взглядом драйверописателя? Добавлено через 7 часов, 17 минут и 17 секунд:Всё пошли в DbgView отладочные сообщения. Просто я их первый раз в директиву не оформил.
|
|
« Последнее редактирование: 18-12-2011 08:53 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #88 : 18-12-2011 09:48 » |
|
в код драйвера вставляете функции DbgPrint("tochka1"); драйвер должен быть скомпилирован в Debug версии. перед запуском драйвера запускаете DbgView. он выводит все выполненные в драйвере DbgPrint(). как printf() в консоли. по ним можно отследить все пройденные точки и состояния в драйвере. в принципе то же самое можно сделать и функциями вывода в системный лог.
насчет блокирования - видимо драйвер лезет куда не должен)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #89 : 18-12-2011 10:25 » |
|
в код драйвера вставляете функции DbgPrint("tochka1"); Так я же вам уже написал, что сообщения пошли, я вставил DbgPrint() везде, где выводится сообщения в системный лог. Во вложении картинка DbgView. Вот один из моих DbgView: NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_READ, DeviceObject, NULL); #if DBG DbgPrint("Read", MSG_READ); #endif return STATUS_SUCCESS; } PS Может не там я DbgPrint'ы расставил? Подскажите пожалуйста, где например было бы правильно поставить, поконкретнее. Добавлено через 1 час, 3 минуты и 6 секунд:Никак не могу разобраться с этими DbgPrint'ами. Где их ставить? Хоть самому вместо них в драйвер залезать
|
|
« Последнее редактирование: 18-12-2011 12:38 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
|