подскажите пожалуйста, как можно вызвать функцию 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
Llirik > Как вызывать из 16-разрядной я нашел Покажи (или ссылку дай). На чем ты проверяешь работоспособность своего кода? Imho надо было предыдущую тему Межсегментные вызовы up'нуть этим сообщением. ps 2 Admins У движка форума есть возможность сцеплять темы (пристраивать новую вниз уже существующей)?
Функции из 16-битных DLL вызываются сервисом _SHELL_CallDll из shell.vxd. Об этом мельком говорится в 7-ом Уроке Iczelion'а о vxd. чтобы узнать по-подробнее надо почитать документацию к DDK, но у меня ее нет. Или распотрошить какой-нибудь vxd IDA`ой)) Помогает) Работоспособность пока проверить не могу так, как ни один из этих кодов не хочет компилироваться( А что в них изменить не знаю
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? Я не знаю. > Работоспособность пока проверить не могу Хорошо. На чем планируешь проверять?
Так я же не знаю языка C/C++) а как проверять работоспособность буду? Да просто) Кину свой vxd в папку vmm32, пропишу его в ключе HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD и перезагружу свой комп) если он зависнет, значит у меня кривые ручки)) тогда искать причину SoftIce`ом
Нет это у вас. Причины опишите по изза которых невозможно с оборудованием работать. Не можешь вектор прерывания установить - ну так это не гейца проблемы, если нуб то и не кричи что ось кривая.
Во-первых у меня ДЦП и я не могу в ХР играть в большинство игр из-за недествия в них управления мышью с клавиатуры. Во-вторых есть парочка игр для DOS, которые в ХР идут просто ужасно, а поиграть в них иногда хочется, а в-третьих не хочется бросать своё детище - свою ОС. все-таки как ни как 2 года на нее положил)
я все-таки нашел сервис позволяющий загружать 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
phModule - выходной параметр, указатель на переменную, которая получит HANDLE т.е. базу загруженного модуля. pFileName - указатель на путь вместе с именем. Как тебе пришло в голову не знаю)))
будьте добры, расскажите мне пожалуйста о сервисе VMM Fatal_Error_Handler, так как его описание в инете я не нашел. Суть в следущем; мне надо в случае ошибки загрузки ntoskrnl.exe вывести на экран сообщение, но дело происходит до запуска графической оболочки, по этому воспользоваться простым MessageBox я не могу
Код получился вот такой: .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 В чем моя ошибка или что здесь нужно еще дописать?
Вот код: .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?