inf158704
Участник
Offline
|
|
« : 19-12-2012 12:58 » |
|
PVOID PoRegisterSystemState(PVOID hstate, ULONG flags) VOID PoSetSystemState(ULONG flags) VOID ReuseIrp(PIRP Irp, NTSTATUS status) NTSTATUS IoAcquireRemoveLockEx(PIO_REMOVE_LOCK p, PVOID tag, PCSTR file, ULONG line, ULONG size) BOOL CheckPrecisionErrata() BOOLEAN PsGetVersion(PULONG MajorVersion, PULONG MinorVersion, PULONG BuildNumber, PUNICODE_STRING spnum) PKEVENT IoCreateNotificationEvent(PUNICODE_STRING EventName, PHANDLE EventHandle)
тип, спецификатор типа и ключевое слово в языках программирования Си, Си++, Java как понять и как использовать...
|
|
|
Записан
|
|
|
|
LemmonRus
Помогающий
Offline
В правильно заданном вопросе 90% ответа.
|
|
« Ответ #1 : 19-12-2012 13:42 » |
|
PVOID PoRegisterSystemState(PVOID hstate, ULONG flags) VOID PoSetSystemState(ULONG flags) VOID ReuseIrp(PIRP Irp, NTSTATUS status) NTSTATUS IoAcquireRemoveLockEx(PIO_REMOVE_LOCK p, PVOID tag, PCSTR file, ULONG line, ULONG size) BOOL CheckPrecisionErrata() BOOLEAN PsGetVersion(PULONG MajorVersion, PULONG MinorVersion, PULONG BuildNumber, PUNICODE_STRING spnum) PKEVENT IoCreateNotificationEvent(PUNICODE_STRING EventName, PHANDLE EventHandle)
тип, спецификатор типа и ключевое слово в языках программирования Си, Си++, Java как понять и как использовать...
Почитай про Венгерскую нотацию . pVOID соответствует void * ULONG соответствует unsigned long специфика Microsoft NTSTATUS соответствует long BOOL соответствует int BOOLEAN соответствует unsigned char З.Ы. Лезть в DDK не зная простейших вещей,как-то странно.
|
|
« Последнее редактирование: 19-12-2012 14:01 от LemmonRus »
|
Записан
|
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #2 : 19-12-2012 20:05 » |
|
Спасибо, все понял... месяц а то голову ломал...
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #3 : 20-12-2012 02:41 » |
|
Спасибо, все понял... месяц а то голову ломал...
Вы издеваетесь?
|
|
|
Записан
|
while (8==8)
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #4 : 20-12-2012 04:08 » |
|
нет если по подробнее конечно былобы тоже хорошо...
|
|
« Последнее редактирование: 20-12-2012 04:59 от inf158704 »
|
Записан
|
|
|
|
LemmonRus
Помогающий
Offline
В правильно заданном вопросе 90% ответа.
|
|
« Ответ #5 : 20-12-2012 08:57 » |
|
нет если по подробнее конечно былобы тоже хорошо...
В каком плане поподробней? Спрашивай.
|
|
|
Записан
|
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #6 : 04-02-2013 09:09 » |
|
еще один глупый вопрос задам
. static PFN addresses[] = { (PFN) PoRegisterSystemState, };
как тут должно быть обявлена PoRegisterSystemState
EXPORT VOID PoRegisterSystemState( ... ); это вроде нето
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #7 : 04-02-2013 11:07 » |
|
как вариант - посмотреть как объявлен typedef PFN.
|
|
« Последнее редактирование: 04-02-2013 11:09 от darkelf »
|
Записан
|
|
|
|
LemmonRus
Помогающий
Offline
В правильно заданном вопросе 90% ответа.
|
|
« Ответ #8 : 05-02-2013 11:02 » |
|
еще один глупый вопрос задам . static PFN addresses[] = { (PFN) PoRegisterSystemState, };
как тут должно быть обявлена PoRegisterSystemState
EXPORT VOID PoRegisterSystemState( ... ); это вроде нето
PFN наверняка pointer to function. EXPORT VOID PoRegisterSystemState( ... ); Это судя по всему шаблон(причем полученный из ATL). А тебе нужна непосредственно функция.При определении функции не забудь указать соглашение вызова. P.S>Вообще задавать такие вопросы без функций контекста моветон, ибо телепатов нема.
|
|
« Последнее редактирование: 05-02-2013 11:18 от LemmonRus »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #9 : 05-02-2013 13:00 » |
|
NTKERNELAPI PVOID PoRegisterSystemState ( __inout_opt PVOID StateHandle, __in EXECUTION_STATE Flags ); объявлена в wdm.h находится в Ntoskrnl.lib.
|
|
« Последнее редактирование: 05-02-2013 13:02 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #10 : 09-02-2013 08:15 » |
|
спасибо за то что помогаете я пытаюсь разобратся уже в готовом коде
значит в файле проекта stddcls.h нашел #include <ntddk.h> #include <wmilib.h> wdm.h нигде необявлена сама реализация функции меня неинтересует , она должна быть реализована как раз в драйвере. Только его обявление, имя и переменные которые он использует в ntddk.h есть одно упоминание
NTKERNELAPI PVOID PoRegisterSystemState ( IN PVOID StateHandle, IN EXECUTION_STATE Flags );
немного смущает пробелы перед переменными в wdm.h и ntddk.h и подскажите пожалуста как мне это понять в драйвере реализовано так; PVOID PoRegisterSystemState(PVOID hstate, ULONG flags) { // PoRegisterSystemState ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL); return NULL; } // PoRegisterSystemState
как это стыкуеться между собой непонимаю. но главный вопрос в другом мне требуется реализация функции обявленной в ndis #include <ndis.h> // мои художества я ее подключаю, здесь вопрос обязательно это обявлять в stddcls.h или можно в основном теле добавить, и что еще надо бы обявить еще... так как ошибка осталась имя непринимает дает ошибку в ndis.h вроде обявлено все аналогично: EXPORT VOID NdisInitializeString( OUT PNDIS_STRING Destination, IN PUCHAR Source ); только вот OUT непонятен с ним все связано?
|
|
« Последнее редактирование: 09-02-2013 08:30 от inf158704 »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #11 : 09-02-2013 12:28 » |
|
IN, OUT, INOUT - пустые дефинишены для удобочитаемости кода. указывают какие входные какие выходные переменные. приведенная реализация PoRegisterSystemState проверяет текущий IRQL<DISPATCH_LEVEL и возвращает пустой указатель. если IRQL будет выше APC - вызовет BSOD или брекпоинт.
|
|
« Последнее редактирование: 09-02-2013 12:31 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #12 : 09-02-2013 13:04 » |
|
я пытался заявить вункцию без тела (реализации)(коментировал ее и просто смотрел проглотит кампилятор или нет), для PoRegisterSystemState это проходит, так как обе премненные IN для NdisInitializeString это непройдет, проблема только в этом, все верно? буду смотрет как перемную OUT PNDIS_STRING Destination заявить и определить хотябы просто как слово для начала...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #13 : 09-02-2013 13:42 » |
|
наличие IN/OUT в определении входных/выходных переменных функции никак не влияет ни на что) потому что #define IN #define OUT они пустые! можете сделать даже #define _sddgkjahflgjkaf_ и дальше вставлять в любое место кода _sddgkjahflgjkaf_ - результат компиляции не изменится.
PS для PoRegisterSystemState компиляция без указания реализации пройдет только в одном случае, если PoRegisterSystemState нигде в конечном счете не используется, либо реализация определена где то еще, в либе или еще где.
|
|
« Последнее редактирование: 09-02-2013 13:45 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #14 : 09-02-2013 17:41 » |
|
PS для PoRegisterSystemState компиляция без указания реализации пройдет только в одном случае, если PoRegisterSystemState нигде в конечном счете не используется, либо реализация определена где то еще, в либе или еще где.
все верно не используеться тогда я застрял... незнаю в какую сторону копать
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #15 : 10-02-2013 00:54 » |
|
а чего копать то? в чем вопрос?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #16 : 10-02-2013 07:27 » |
|
Creating library objchk_wxp_x86\i386\wdmstub.lib and object objchk_wxp_x86\i386\wdmstub.exp Wdmstub.obj : error LNK2019: unresolved external symbol __imp__NdisInitializeString@8 referenced in function _$E5 objchk_wxp_x86\i386\wdmstub.sys : fatal error LNK1120: 1 unresolved externals Error executing link.exe.
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #17 : 11-02-2013 06:51 » |
|
Creating library objchk_wxp_x86\i386\wdmstub.lib and object objchk_wxp_x86\i386\wdmstub.exp Wdmstub.obj : error LNK2019: unresolved external symbol __imp__NdisInitializeString@8 referenced in function _$E5 objchk_wxp_x86\i386\wdmstub.sys : fatal error LNK1120: 1 unresolved externals Error executing link.exe.
Это уже при линковке - в тех библиотеках, что подключаются, не оказалось такой функции.
|
|
|
Записан
|
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #18 : 16-02-2013 19:21 » |
|
функции определяющую переменную может? я думаю что просто функия должна брать IN а выдавать OUT так как я ее не рализовал то и при линковке и возникает такая ошибка (переменю неопределил так как). все верно понимаю? я попробовал взять за основу реализацию другой функции которая также использует IN и OUT переменные, к сожалению неудалось пока ничего сделать...
всетаки еще рас спрошу про связи
NTKERNELAPI PVOID PoRegisterSystemState (IN PVOID StateHandle,IN EXECUTION_STATE Flags); в реализации PVOID PoRegisterSystemState(PVOID hstate, ULONG flags)
IN PVOID StateHandle=PVOID hstate - тоесть задаю просто тип и... что означает hstate а как можно узнать какой тип должен быть для PNDIS_STRING Destination?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #19 : 17-02-2013 20:01 » |
|
вам надо немножко вглубь копнуть) а именно - каким образом с точки зрения процессора/ассемблера передаются агрументы в функции) почитайте литературу по этому поводу - это вам очень пригодится и сильно облегчит понимание) что именно читать - сознательно умолчу, попробуйте сами найти) "IN PVOID StateHandle=PVOID hstate - тоесть задаю просто тип и... что означает hstate " - из разряда что означает слово паровоз?) не знаю как где, но обычно(в винде по крайней мере) буква "h" при определении типа может означать что это хендл(handle) чего либо. поищите что такое. тип у "PNDIS_STRING Destination" должен быть PNDIS_STRING) обычно, первая буква P (или LP) при определении типа означает что это указатель. для переменной маленькая буква "p" в начале переменной. - опять же разберитесь что такое указатель физически, с точки зрения процессора. но подчеркиваю "обычно" - это не обязательно. называть можно как угодно. это просто общее соглашение для удобочитаемости)
PS если кто то видел литературу с рекомендациями по тому как принято давать имена, посоветуйте. я не в теме...
|
|
« Последнее редактирование: 17-02-2013 20:06 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #20 : 04-03-2013 11:40 » |
|
Спасибо почитал по вашему совету о передаче аргумента действительно стало понятнее... Мой первый вопрос в теме был оказываеться не так прост и теперь я понимаю недовольство по поводу моего оптимизма уважаемого sss. В чем еще не разобрался: если функция имеет аргумент void тоесть неимеет аргумента то тогда вообще зачем она нужна... понимаю что она может управлять при этом внутренними общими переменными какимито но... в общем пока несовсем ясно... также что такое код ошибки функции... как она передаеться если функция опять же VOID например или в даном случее ошибки небывает? очень интересную информацию нашел здесь http://onembedding.bialix.com/hints/hacks/asm-inline/ это конечно не винда но асемблерная вставка меня как раз очень интересует... Добавлено через 26 минут и 52 секунды:имею следующий код в асм для тогоже NdisInitializeString ; Exported entry 136. NdisInitializeString ; Attributes: bp-based frame ; __stdcall NdisInitializeString(x, x)
public _NdisInitializeString@8 _NdisInitializeString@8 proc near
arg_0= dword ptr 8 arg_4= dword ptr 0Ch
mov edi, edi push ebp mov ebp, esp push edi mov edi, [ebp+arg_4] mov eax, edi lea ecx, [eax+1]
loc_128C3: mov dl, [eax] inc eax test dl, dl jnz short loc_128C3 push esi mov esi, [ebp+arg_0] sub eax, ecx add eax, eax mov [esi], ax add eax, 2 mov [esi+2], ax movzx eax, ax push 7473444Eh push eax push 0 call ds:__imp__ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x) test eax, eax mov [esi+4], eax pop esi jz short loc_1290B
loc_128F5: mov cl, [edi] test cl, cl jz short loc_12907 movzx cx, cl mov [eax], cx inc edi inc eax inc eax jmp short loc_128F5
loc_12907: and word ptr [eax], 0
loc_1290B: pop edi pop ebp retn 8 _NdisInitializeString@8 endp как можно реализовать переход call ds:__imp__ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x) за образец хочу взять следующее FORCEINLINE VOID RtlInterlockedSetBitsDiscardReturn( IN OUT PULONG Flags, IN ULONG Flag ) { __asm { mov ecx, Flags mov eax, Flag #if defined (NT_UP) or [ecx], eax #else lock or [ecx], eax #endif } }
|
|
« Последнее редактирование: 04-03-2013 12:19 от inf158704 »
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #21 : 04-03-2013 13:34 » |
|
В чем еще не разобрался: если функция имеет аргумент void тоесть неимеет аргумента то тогда вообще зачем она нужна... понимаю что она может управлять при этом внутренними общими переменными какимито но... в общем пока несовсем ясно...
да, правильно, или функция типа вывода какого-нибудь внутреннего состояния или чего-то заранее предопределённого или внутреннего. также что такое код ошибки функции... как она передаеться если функция опять же VOID например или в даном случее ошибки небывает?
Вы имеете в виду если функция возвращает void? Так бывает, если никаких ошибочных ситуаций не существует (или функция просто не диагностирует такие ситуации).
|
|
|
Записан
|
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #22 : 05-03-2013 04:47 » |
|
нашел пример вызова функции из функции VOID FreeWorkItem(PIO_WORKITEM item) { // FreeWorkItem ExFreePool(item); } // FreeWorkItem только вот в чем немогу разобратся для NdisInitializeString: ; __stdcall NdisInitializeString(x, x) - заявлено что имеет 2 аргумента тип PNDIS_STRING для 1 и PUCHAR для 2 а вот ExAllocatePoolWithTag(x,x,x) здесь заявлено 3 как можно сориентироваться по асемблеру, что тут появилось еще, в принципе должна быть константа какаято только в каком регистре в wdm.h ExAllocatePoolWithTag описан так: NTKERNELAPI PVOID NTAPI ExAllocatePoolWithTag( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag ); поясню что меня смущает: вызов ExAllocatePoolWithTag(POOL_TYPE PoolType,SIZE_T NumberOfBytes,ULONG Tag) я сделать немогу так как у меня все уже раскидано по регистрам мне нужно будет повторно сделать присвоение для переменных PoolType, NumberOfBytes, Tag, а потом сделать вызов ExAllocatePoolWithTag(POOL_TYPE PoolType,SIZE_T NumberOfBytes,ULONG Tag) поясните пожалуста как должено выглядить присвоение этих переменных
|
|
« Последнее редактирование: 05-03-2013 06:09 от inf158704 »
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #23 : 05-03-2013 06:28 » |
|
inf158704, а зачем Вы пишете на ассемблере, есть C, в котором это делается очень даже удобно. Чтобы узнать что в каком регистре передаётся, надо знать соглашения по вызову - по-моему в функциях ядра Windows используется stdcall calling convention - почитайте про неё в сети ( http://en.wikipedia.org/wiki/X86_calling_conventions), насколько я понимаю - там вообще всё должно передаваться через стек, т.е. что-то типа: push Tag push NumberOfBytes push PoolType call ExAllocatePoolWithTag
Зачем нужны PoolType и Tag почитайте в справке на саму функцию ExAllocatePoolWithTag.
|
|
|
Записан
|
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #24 : 05-03-2013 07:29 » |
|
это не мой код я его с помощю IDA просто вытащил из ndis.sys... си я только начал изучать, и пока разберусь годы пройдут, да и реализация функций ядра штука думаю очень сложная, а стырить всегда можно у MS буду изучать спасибо за подсказку
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #25 : 05-03-2013 07:56 » |
|
это не мой код я его с помощю IDA просто вытащил из ndis.sys... си я только начал изучать, и пока разберусь годы пройдут, да и реализация функций ядра штука думаю очень сложная, а стырить всегда можно у MS буду изучать спасибо за подсказку Можно взять WINDDK, там есть примеры драйверов на C с комментариями.
|
|
|
Записан
|
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #26 : 15-03-2013 05:00 » |
|
по асемблерной втавки дали мне совет делать все немного подругому, а имено вставку делать при линковке. к сожаленю для себя обнаружил что делать то я этого неумею. visual C++ 6 нормально компилирует и собирает мои файла а вот когда бытаюсь собрать их через link самостоятельно идут ошибки с именами VC при компиляции создает следующие файлы: wdmstub.exp vc70.idb wdmstub.lib wdmstub.NMS DriverEntry.obj NonStubs.obj stddcls.obj Wdmstub.obj wdmstub.pch wdmstub.pdb driver.res DriverEntry.sbr NonStubs.sbr stddcls.sbr Wdmstub.sbr wdmstub.sys я пытался скомпилировать с ключом c:\winddk\2600\bin\x86\link /SUBSYSTEM:NATIVE DriverEntry.obj NonStubs.obj stddcls.obj Wdmstub.obj подскажите нужно ли мне еще чтото добавлять в progect opions в VC у меня вообще такая запись ntoskrnl.lib hal.lib wmilib.lib wdm.lib vxdwraps.clb /nologo /base:"0x10000" /version:5.1 /stack:0x40000,0x1000 /entry:"DriverEntry@8" /incremental:no /pdb:"objchk_wxp_x86\i386/wdmstub.pdb" /machine:IX86 /nodefaultlib /out:"objchk_wxp_x86\i386\wdmstub.sys" /libpath:"$(98ddk)\lib\i386\free" -align:0x80 -debug:full -driver:wdm -fullbuild -ignore:4010,4037,4039,4049,4065,4070,4078,4087,4089,4198,4221,4210 -merge:_PAGE=PAGE -merge:_TEXT=.text -opt:icf -opt:nowin98 -opt:ref -osversion:4.00 -release -section:init,d -subsystem:native,4.00 или может есть способ какойто obj потключить в самом листинге пока нашел только это: При линковке asm функций в С программу следует учесть следующие моменты: транслятор ассемблера по умолчанию переводит все имена в верхний регистр, myfunc станет MYFUNC; компилятор С и линковщик могут различать или не различать символы верхнего и нижнего регистра, что собственно зависит от настроек; компилятор С (не С++!) к имени функции добавляет подчеркивание в начале, вызываешь функцию func(), линковщик будет искать _func(); при вызове функции С/С++ программа размещает параметры в стеке и чистит стек после завершения функции, возвращаемое значение берется из регистра AX (EAX),
Объявлять функции в asm коде необходимо таким образом (чтоб можно было вызвать из С) PUBLIC _MYFUNC _MYFUNC PROC C FAR где PUBLIC открывает доступ к функции из других модулей, подчеркивание перед _MYFUNC приводит имя к С виду, PROC C сообщает транслятору asm что твоя функция предназначена для вызова из С, FAR размещает функцию в отдельном сегменте данных, что позволяет получить доступ к функции если размер программы в памяти больше 64К (необходимо для больших моделей памяти) Кроме этого в masm-е и tasm-е есть множество макросов предназначенных для работы с параметрами как в С.
Для вызова asm функции _MYFUNC из С потребуется: создать прототип функции extern far int MYFUNC(); включить поддержку линковщиком символов в верхнем регистре; подключить obj или lib (если сделал) к проекту.
|
|
« Последнее редактирование: 15-03-2013 07:38 от inf158704 »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #27 : 15-03-2013 10:08 » |
|
настройки проекта, свойства конфигурации, "Linker->Input" поле Additional Dependencies
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
inf158704
Участник
Offline
|
|
« Ответ #28 : 16-04-2013 07:33 » |
|
vc ++ 6.0 использую может ктото помнит как это сделать в нем?
|
|
|
Записан
|
|
|
|
LemmonRus
Помогающий
Offline
В правильно заданном вопросе 90% ответа.
|
|
« Ответ #29 : 16-04-2013 09:39 » |
|
vc ++ 6.0 использую может ктото помнит как это сделать в нем?
Project->Settings->Linker
|
|
|
Записан
|
|
|
|
|