Тема: JScript/VBScript & Win32: расширение возможностей DynamicWrapperX
Данный скрипт расширяет возможности объекта DynamicWrapperX, а именно:
1. Добавляет новый встроенный метод RegisterAddr. Первый параметр - адрес памяти, остальные параметры, как у метода Register.
RegisterAddr( Addr, FuncName [, i=ParamTypes] [, r=RetValType] )
Этот метод "именует" участок кода в виртуальном пространстве процесса. Это позволяет, например, сделать ассемблерную вставку из скрипта и напрямую обратиться к ней. Кроме этого, это позволяет обратится к "кривым" экспортным функциям ("?GetBkEndUI@@YAPAVCBkEndUI@@XZ") и к функциям экспортируемым по ординалу.
Пример:
handle = Wrap.LoadLibrary(""BkEnd"")
Addr = Wrap.GetProcAddress(handle, ""?GetBkEndUI@@YAPAVCBkEndUI@@XZ"") 'class CBkEndUI * __cdecl GetBkEndUI(void)
Wrap.RegisterAddr Addr, ""GetBkEndUI"", ""f=s"", ""r=l""
Этим же методом можно легко организовать вызов _thiscall, сделав ассемблерную вставку:
handle = Wrap.LoadLibrary(""blang"")
func = Wrap.GetProcAddress(handle, ""?FindProc@CBLModule@@QBEHPBDH@Z"") 'CBLModule::FindProc
Wrap.RegisterAddr buf, ""FindProc"", ""i=sl"", ""r=l""
.
.
.
Function this_call(ECX, Addr) '
Wrap.NumPut &hB9, buf, 0, ""b"" ' mov ecx, .... pObj
Wrap.NumPut ECX, buf, 1
Wrap.NumPut &hE9, buf, 5, ""b"" ' jmp ...Addr
Wrap.NumPut Addr - (buf + 6 + 4), buf, 6 '
End Function
2. Снимает ограничение на количество вызовов RegisterCallBack. Это реализовано, путем организации связанного списка функций, аналогично, как это делает метод Register.
Технические исправления:
* в IClassFactory::CreateInstance изменен размер объекта на указатель на последний вызов RegisterCallBack;
* IDispatch::Release освобождается не только память под объект, но и память выделенная методами Register и обновленным RegisterCallBack; так же вызывается Release для объекта vbscript.
P.S. Всё сказанное относится к конкретной версии dll, т.к. в скрипте используются "абсолютные" offset'ы, привязанные к файлу «dynwrapx.dll».
P.P.S. В связи с тем, что мой опыт программирования на ассемблере не велик, возможно что-то я сделал не оптимально, поэтому буду рад услышать критику.