вызов dll из vxd

Тема в разделе "WASM.WIN32", создана пользователем Llirik, 24 апр 2009.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    подскажите пожалуйста, как можно вызвать функцию 32-разрядной DLL из VXD? Как вызывать из 16-разрядной я нашел, а вот как из 32-разрядной нет. Код такой:

    .386p
    includelib C:\masm32\lib\ntoskrnl.lib
    include C:\masm32\bin\win98\inc\win98\vmm.inc
    include C:\masm32\bin\win98\inc\win98\vxdldr.inc

    extrn KeNumberProcessors:BYTE
    extern _imp__KeRevertToUserAffinityThread@0 : dword
    extern _imp__KeSetSystemAffinityThread@4 : dword
    extern _imp__IoForwardIrpSynchronously@8 : dword
    DECLARE_VIRTUAL_DEVICE OSXPKERN,1,0, OSXPKERN_Control, 99h, NTKERN_INIT_ORDER

    Begin_control_dispatch OSXPKERN
    Control_Dispatch Sys_Critical_Init, AdExpTabl
    End_control_dispatch OSXPKERN

    VxD_PAGEABLE_DATA_SEG
    hexport dd 0
    ntker db 'ntoskrnl.exe',0

    offunk dd offset KeNumberProcessors
    dd offset KeRevertToUse
    dd offset KesetSystemAf
    dd offset IoForwardllrp
    aKeNumberPr db "KeNumberProcessorK"
    aKeRevertToUse db "KeRevertToUserAffinityThreaK"
    aKesetSystemAf db "KesetSystemAffinityThreaK"
    aIoForwardll db "IoForwardlrpSynchronouslK"

    oftabntkrnl dd offset aKeNumberPr
    dd offset aKeRevertToUse
    dd offset aKesetSystemAf
    dd offset aIoForwardll
    ordinal db 0,0,1,0,2,0,3,0
    VxD_PAGEABLE_DATA_ENDS

    VxD_PAGEABLE_CODE_SEG
    BeginProc KeRevertToUse
    call _imp__KeRevertToUserAffinityThread@0
    ret
    EndProc KeRevertToUse

    BeginProc KesetSystemAf
    call _imp__KeRevertToUserAffinityThread@0
    ret
    EndProc KesetSystemAf

    BeginProc IoForwardllrp
    call _imp__KeRevertToUserAffinityThread@0
    ret
    EndProc IoForwardllrp
    VxD_PAGEABLE_CODE_ENDS


    VxD_INIT_CODE_SEG

    BeginProc AdExpTabl
    push 0
    push offset offunk
    push offset ordinal
    push offset oftabntkrnl
    push 1
    push 4
    push 4
    push offset ntker
    push offset hexport
    VxDCall _PELDR_AddExportTable
    ret
    EndProc AdExpTabl

    VxD_INIT_CODE_ENDS

    end

    или

    .386p
    includelib C:\masm32\lib\ntoskrnl.lib
    include C:\masm32\bin\win98\inc\win98\vmm.inc
    include C:\masm32\bin\win98\inc\win98\vxdldr.inc
    ;extrn Control_0:far
    extren AdExpTabl:far
    extern KeRevertToUserAffinityThread:near
    extern KesetSystemAffinityThread:near
    extern IoForwardlrpSynchronously:near
    LCOD segment para public 'CODE' use32
    ASSUME cs:LCOD
    public OSXPKERN_1
    OSXPKERN_1 dd 0 ; Next_0
    SDK_Version_0 dw 40Ah
    Req_Device_Number_0 dw 99h
    Dev_Major_Version_0 db 1 ; Major device number
    Dev_Minor_Version_0 db 0 ; Minor device number
    Flags_0 dw 0 ; Flags for init calls complete
    Name_0 db 'OSXPKERN' ; Device name
    Init_Order_0 dd 16200000h ; Initialization Order
    Control_Proc_0 dd offset Control_0 ; Offset of control procedure
    V86_API_Proc_0 dd 0 ; Offset of API procedure (or 0)
    PM_API_Proc_0 dd 0 ; Offset of API procedure (or 0)
    V86_API_CSIP_0 dd 0 ; CS:IP of API entry point
    PM_API_CSIP_0 dd 0 ; CS:IP of API entry point
    Reference_Data_0 dd 0 ; Reference data from real mode
    Service_Table_Ptr_0 dd 0 ; Pointer to service table
    Service_Size_0 dd 0 ; Number of services
    Win32_Service_Table_0 dd 0 ; Pointer to Win32 services
    Prev_0 dd 50726576h ; Pointer to previous DDB
    Size_0 dd 50h ; Size of VxD_Desc_Block
    Reserved1_0 dd 52737631h
    Reserved2_0 dd 52737632h
    Reserved3_0 dd 52737633h


    public Control_0
    Control_0 proc near

    cmp eax, 0
    jz far ptr adtabl
    clc
    retn
    Control_0 endp

    LCOD ENDS

    PDAT segment para public 'DATA' use32
    assume cs:PDAT
    hexport dd 0
    ntker db 'ntoskrnl.exe',0

    offunk dd offset KeRevertToUse
    dd offset KesetSystemAf
    dd offset IoForwardllrp
    aKeNumberPr db "KeNumberProcessorK"
    aKeRevertToUse db "KeRevertToUserAffinityThreaK"
    aKesetSystemAf db "KesetSystemAffinityThreaK"
    aIoForwardll db "IoForwardlrpSynchronouslK"

    oftabntkrnl dd offset aKeNumberPr
    dd offset aKeRevertToUse
    dd offset aKesetSystemAf
    dd offset aIoForwardll
    ordinal db 0,0,1,0,2,0,3,0
    PDAT ENDS

    PCOD segment para public 'CODE' use32
    ASSUME cs:PCOD

    KeRevertToUse proc near
    call KeRevertToUserAffinityThread
    ret
    KeRevertToUse endp

    KesetSystemAf proc near
    call KesetSystemAffinityThread
    ret
    KesetSystemAf endp

    IoForwardllrp proc near
    call IoForwardlrpSynchronously
    ret
    IoForwardllrp endp
    PCOD ENDS


    ICOD segment para public 'CODE' use32
    ASSUME cs:ICOD
    adtabl:
    push 0
    push offset offunk
    push offset ordinal
    push offset oftabntkrnl
    push 1
    push 4
    push 4
    push offset ntker
    push offset hexport
    VxDCall _PELDR_AddExportTable
    retn

    ICOD ENDS

    end Control_0
     
  2. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    сдуреть
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Llirik
    > Как вызывать из 16-разрядной я нашел
    Покажи (или ссылку дай).

    На чем ты проверяешь работоспособность своего кода?

    Imho надо было предыдущую тему Межсегментные вызовы up'нуть этим сообщением.

    ps
    2 Admins
    У движка форума есть возможность сцеплять темы (пристраивать новую вниз уже существующей)?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    у punbb есть.
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Функции из 16-битных DLL вызываются сервисом _SHELL_CallDll из shell.vxd. Об этом мельком говорится в 7-ом Уроке Iczelion'а о vxd. чтобы узнать по-подробнее надо почитать документацию к DDK, но у меня ее нет. Или распотрошить какой-нибудь vxd IDA`ой)) Помогает) Работоспособность пока проверить не могу так, как ни один из этих кодов не хочет компилироваться( А что в них изменить не знаю
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Llirik
    Для вызова из 16-тибитного кода 32-ухбитного можно воспользоваться цепочкой LoadLibraryEx32W + GetProcAddress32W + CallProcEx32W / CALLPROC32W + FreeLibrary32W. Для user mode я пробовал - удачно.

    Тут есть разные примеры на C/С++. Среди них есть AppyTime.VxD (9'176 байт), который по заявлению автора, "load a 32-bit DLL and call its API from VxD", используя указанную выше последовательность подпрограмм.

    Можно ли так общаться с ntoskrnl.exe? Я не знаю.

    > Работоспособность пока проверить не могу
    Хорошо. На чем планируешь проверять?
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Так я же не знаю языка C/C++) а как проверять работоспособность буду? Да просто) Кину свой vxd в папку vmm32, пропишу его в ключе HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD и перезагружу свой комп)
    если он зависнет, значит у меня кривые ручки)) тогда искать причину SoftIce`ом
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Llirik
    Установите нормальную ось и пишите нормальные драйвера, 9x уже давно музейный экспонат.
     
  9. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    нет. в ОС семейства НТ нормальная работа для по ряду причин не возможна! но это не связано с железом
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Llirik
    Первая причина - руки не стого места ростут ?
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    да! У Билли Гейтса!))
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Нет это у вас. Причины опишите по изза которых невозможно с оборудованием работать. Не можешь вектор прерывания установить - ну так это не гейца проблемы, если нуб то и не кричи что ось кривая.
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Во-первых у меня ДЦП и я не могу в ХР играть в большинство игр из-за недествия в них управления мышью с клавиатуры. Во-вторых есть парочка игр для DOS, которые в ХР идут просто ужасно, а поиграть в них иногда хочется, а в-третьих не хочется бросать своё детище - свою ОС. все-таки как ни как 2 года на нее положил)
     
  14. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    я все-таки нашел сервис позволяющий загружать 32-битные DLL, а впоследствии вызывать из них API, но так как я плохо знаю английский, подскажите пожалуйста правильно ли я перевел)

    PELDR_LoadModule(PHPEMODULE phModule,
    PSTR pFileName, PHLIST phList);

    phModule - имя dll
    phFileName - полный путь к dll
    phList - какие-то ограничения таблицы экспорта, NULL без ограничений

    ссылка http://www.osronline.com/ddkx/w98ddk/kernel_4c6x.htm
     
  15. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    phModule - выходной параметр, указатель на переменную, которая получит HANDLE т.е. базу загруженного модуля.
    pFileName - указатель на путь вместе с именем. Как тебе пришло в голову
    не знаю)))
     
  16. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    сказал же плохо с английским))
     
  17. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    будьте добры, расскажите мне пожалуйста о сервисе VMM Fatal_Error_Handler, так как его описание в инете я не нашел. Суть в следущем; мне надо в случае ошибки загрузки ntoskrnl.exe вывести на экран сообщение, но дело происходит до запуска графической оболочки, по этому воспользоваться простым MessageBox я не могу
     
  18. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Код получился вот такой:

    .386p
    include C:\masm32\bin\win98\inc\win98\vmm.inc
    include C:\masm32\bin\win98\inc\win98\vxdldr.inc

    DECLARE_VIRTUAL_DEVICE OSXPKERN,1,0, OSXPKERN_Control, 99h, NTKERN_INIT_ORDER

    Begin_control_dispatch OSXPKERN
    Control_Dispatch Sys_Critical_Init, AdExpTabl
    End_control_dispatch OSXPKERN

    VxD_PAGEABLE_DATA_SEG
    halerr db "Отсутстует или поврежден hal.dll",0
    halhwnd dd 0
    halpath db 'C:\WINDOWS.ME\SYSTEM32\hal.dll',0
    VxD_PAGEABLE_DATA_ENDS

    VxD_INIT_CODE_SEG

    BeginProc AdExpTabl
    push 0
    push offset32 halpath
    push offset32 halhwnd
    VxDCall _PELDR_LoadModule
    cmp halhwnd,0
    jnz halok
    mov esi,offset32 halerr
    mov eax,1
    VMMCall Fatal_Error_Handler
    halok:
    ret
    EndProc AdExpTabl

    VxD_INIT_CODE_ENDS

    end

    Но на этапе загрузки Windows выдает: Ошибка иницилизации устройства OSXPKERN
    В чем моя ошибка или что здесь нужно еще дописать?
     
  19. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Вот код:

    .386p
    include C:\masm32\bin\win98\inc\win98\vmm.inc
    include C:\masm32\bin\win98\inc\win98\vxdldr.inc

    DECLARE_VIRTUAL_DEVICE OSXPKERN,1,0, OSXPKERN_Control, UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER

    Begin_control_dispatch OSXPKERN
    Control_Dispatch Device_Init, AdExpTabl
    Control_Dispatch PELDR_ERR_FILE_UNABLETOOPEN, haler
    Control_Dispatch PELDR_ERR_MEM_NOMEMORY, halermem
    Control_Dispatch PELDR_ERR_IMAGE_INVALIDSIZE, halerim
    Control_Dispatch PELDR_ERR_IMAGE_INVALIDFORMAT, halerfor
    Control_Dispatch PELDR_ERR_FILE_READERROR, haleread
    End_control_dispatch OSXPKERN

    VxD_PAGEABLE_DATA_SEG
    halerr db "ЋвбгвбвўгҐв Ё«Ё Ї®ўаҐ¦¤Ґ­ hal.dll",0
    halerrmem db "ЌҐ¤®бв в®з­® Ї ¬пвЁ ¤«п § Јаг§ЄЁ hal.dll",0
    halerrimage db "ЋиЁЎЄ  а §¬Ґа  hal.dll",0
    halerrformat db "ЌҐўҐа­л© д®а¬ в hal.dll",0
    halerrread db "ЋиЁЎЄ  з⥭Ёп hal.dll",0
    halhwnd dd 0
    halpath db "C:\WINDOWS.ME\SYSTEM32\hal.dll",0
    VxD_PAGEABLE_DATA_ENDS

    VxD_PAGEABLE_CODE_SEG

    BeginProc haler
    mov esi,offset32 halerr
    mov eax,0
    VMMCall Fatal_Error_Handler
    ret
    EndProc haler
    BeginProc halermem
    mov esi,offset32 halerrmem
    mov eax,0
    VMMCall Fatal_Error_Handler
    ret
    EndProc halermem
    BeginProc halerim
    mov esi,offset32 halerrimage
    mov eax,0
    VMMCall Fatal_Error_Handler
    ret
    EndProc halerim
    BeginProc halerfor
    mov esi,offset32 halerrformat
    mov eax,0
    VMMCall Fatal_Error_Handler
    ret
    EndProc halerfor
    BeginProc haleread
    mov esi,offset32 halerrread
    mov eax,0
    VMMCall Fatal_Error_Handler
    ret
    EndProc haleread
    VxD_PAGEABLE_CODE_ENDS

    VxD_INIT_CODE_SEG

    BeginProc AdExpTabl
    push 0
    push offset32 halpath
    push offset32 halhwnd
    VxDCall _PELDR_LoadModule
    ret
    EndProc AdExpTabl

    VxD_INIT_CODE_ENDS

    end
    Почему он не хочет компилироваться? И немножко не понял куда возвращается значение ошибки после вызова _PELDR_LoadModule?