Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: PVOID VOID NTSTATUS BOOL BOOLEAN PKEVENT в чем разница и как разобраться  (Прочитано 32117 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
inf158704
Участник

ru
Offline 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
Помогающий

ru
Offline 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
Участник

ru
Offline Offline

« Ответ #2 : 19-12-2012 20:05 » 

Спасибо, все понял... месяц а то голову ломал...
Записан
sss
Специалист

ru
Offline Offline

« Ответ #3 : 20-12-2012 02:41 » 

Спасибо, все понял... месяц а то голову ломал...

Вы издеваетесь?
Записан

while (8==8)
inf158704
Участник

ru
Offline Offline

« Ответ #4 : 20-12-2012 04:08 » 

нет
если по подробнее конечно былобы тоже хорошо...
« Последнее редактирование: 20-12-2012 04:59 от inf158704 » Записан
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #5 : 20-12-2012 08:57 » 

нет
если по подробнее конечно былобы тоже хорошо...
В каком плане поподробней?
Спрашивай.
Записан
inf158704
Участник

ru
Offline Offline

« Ответ #6 : 04-02-2013 09:09 » 

еще один глупый вопрос задам

.
static PFN addresses[] = {
   (PFN) PoRegisterSystemState,
   };

как тут должно быть обявлена
PoRegisterSystemState

EXPORT
VOID
PoRegisterSystemState(    ...     ); это вроде нето


Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #7 : 04-02-2013 11:07 » 

как вариант - посмотреть как объявлен typedef PFN.
« Последнее редактирование: 04-02-2013 11:09 от darkelf » Записан
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #8 : 05-02-2013 11:02 » new

еще один глупый вопрос задам
.
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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
inf158704
Участник

ru
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 09-02-2013 12:28 » 

IN, OUT, INOUT - пустые дефинишены для удобочитаемости кода. указывают какие входные какие выходные переменные.
приведенная реализация PoRegisterSystemState
проверяет текущий IRQL<DISPATCH_LEVEL и возвращает пустой указатель. если IRQL будет выше APC - вызовет BSOD или брекпоинт.
« Последнее редактирование: 09-02-2013 12:31 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
inf158704
Участник

ru
Offline Offline

« Ответ #12 : 09-02-2013 13:04 » 

я пытался заявить вункцию без тела (реализации)(коментировал ее и просто смотрел проглотит кампилятор или нет), для PoRegisterSystemState это проходит, так как обе премненные IN
для  NdisInitializeString это непройдет, проблема только в этом, все верно?
буду смотрет как  перемную OUT   PNDIS_STRING   Destination заявить и определить  хотябы просто как слово для начала...
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
inf158704
Участник

ru
Offline Offline

« Ответ #14 : 09-02-2013 17:41 » 

PS для PoRegisterSystemState  компиляция без указания реализации пройдет только в одном случае, если PoRegisterSystemState  нигде в конечном счете не используется, либо реализация определена где то еще, в либе или еще где.
все верно не используеться
тогда я застрял... незнаю в какую сторону копать
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 10-02-2013 00:54 » 

а чего копать то? в чем вопрос?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
inf158704
Участник

ru
Offline 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
Молодой специалист

ua
Offline 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
Участник

ru
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
inf158704
Участник

ru
Offline 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
Молодой специалист

ua
Offline Offline

« Ответ #21 : 04-03-2013 13:34 » 

В чем еще не разобрался:
если функция имеет аргумент void тоесть неимеет аргумента то тогда вообще зачем она нужна... понимаю что она может управлять при этом внутренними общими переменными какимито но... в общем пока несовсем ясно...
да, правильно, или функция типа вывода какого-нибудь внутреннего состояния или чего-то заранее предопределённого или внутреннего.
также  что такое код ошибки функции... как она передаеться если функция опять же VOID например или в даном случее ошибки небывает?
Вы имеете в виду если функция возвращает void? Так бывает, если никаких ошибочных ситуаций не существует (или функция просто не диагностирует такие ситуации).
Записан
inf158704
Участник

ru
Offline 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
Молодой специалист

ua
Offline 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
Участник

ru
Offline Offline

« Ответ #24 : 05-03-2013 07:29 » 

это не мой код я его с помощю IDA просто вытащил из ndis.sys...
си я только начал изучать,  и пока разберусь годы пройдут, да и реализация функций ядра штука думаю очень сложная,
а стырить всегда можно у MS Улыбаюсь
буду изучать спасибо за подсказку
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #25 : 05-03-2013 07:56 » 

это не мой код я его с помощю IDA просто вытащил из ndis.sys...
си я только начал изучать,  и пока разберусь годы пройдут, да и реализация функций ядра штука думаю очень сложная,
а стырить всегда можно у MS Улыбаюсь
буду изучать спасибо за подсказку
Можно взять WINDDK, там есть примеры драйверов на C с комментариями.
Записан
inf158704
Участник

ru
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 15-03-2013 10:08 » 

настройки проекта, свойства конфигурации, "Linker->Input" поле Additional Dependencies
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
inf158704
Участник

ru
Offline Offline

« Ответ #28 : 16-04-2013 07:33 » 

vc ++ 6.0 использую
может ктото помнит как это сделать в нем?
Записан
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #29 : 16-04-2013 09:39 » 

vc ++ 6.0 использую
может ктото помнит как это сделать в нем?
Project->Settings->Linker
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines