Что нового

DllMem - работа с dll из памяти

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
AutoIt: 3.*
Версия: 1.0

Категория: Разное

Описание: Данная UDF поможет работать с DLL из памяти, раннее была написана товарищем Ward с оф. форума, в UDF был один огромный недостаток, нельзя было работать с более чем 1 DLL из памяти, я решил это исправить.

Код/Пример:
Код:
#Include <DllMem.au3>

;~ Открываем dll в памяти

Global $hDllMem1 = DllMemOpen(PureBasicDll())
Global $hDllMem2 = DllMemOpen(PureBasicDll())

If ($hDllMem1 And $hDllMem2) Then

	;~ Возвращаем указатель на функцию 'PureBasic_MsgBox' из dll

	$pPureBasic_MsgBox1 = DllMemGetAddress($hDllMem1, 'PureBasic_MsgBox')
	$pPureBasic_MsgBox2 = DllMemGetAddress($hDllMem2, 'PureBasic_MsgBox')

	;~ Вызываем функцию по её указателю [PureBasic_MsgBox($sTitle, $sText, $iFlag)]

	If $pPureBasic_MsgBox1 Then
		DllCallAddress('int', $pPureBasic_MsgBox1, 'wstr', 'Заголовок 1', 'wstr', 'Сообщение 1', 'dword', BitOR(32, 5))
	EndIf
	If $pPureBasic_MsgBox2 Then
		DllCallAddress('int', $pPureBasic_MsgBox2, 'wstr', 'Заголовок 2', 'wstr', 'Сообщение 2', 'dword', 48)
	EndIf

	;~ Закрываем dll

	DllMemClose($hDllMem1)
	DllMemClose($hDllMem2)
Endif

;~ Бинарный код dll

Func PureBasicDll()
	Local $bData = '0x'
	$bData &= '4D5A90000300000004000000FFFF0000B8000000000000004000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000080000000'
	$bData &= '0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F'
	$bData &= '742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000'
	$bData &= '504500004C010600F3440B530000000000000000E0000E210B01023200080000'
	$bData &= '000C000000000000001000000010000000300000000000100010000000020000'
	$bData &= '0400000000000000040000000000000000700000000400000000000003000000'
	$bData &= '0000100000100000000010000010000000000000100000000030000049000000'
	$bData &= '044000007800000000500000BC02000000000000000000000000000000000000'
	$bData &= '006000008C000000000000000000000000000000000000000000000000000000'
	$bData &= '000000000000000000000000000000000000000000000000E440000068000000'
	$bData &= '0000000000000000000000000000000000000000000000002E636F6465000000'
	$bData &= 'C000000000100000000200000004000000000000000000000000000020000060'
	$bData &= '2E74657874000000110500000020000000060000000600000000000000000000'
	$bData &= '00000000200000602E72646174610000490000000030000000020000000C0000'
	$bData &= '000000000000000000000000400000402E646174610000000C03000000400000'
	$bData &= '00040000000E0000000000000000000000000000400000C02E72737263000000'
	$bData &= 'BC02000000500000000400000012000000000000000000000000000040000040'
	$bData &= '2E72656C6F6300008C0000000060000000020000001600000000000000000000'
	$bData &= '0000000040000042000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '837C240801750E8B442404A3F0420010E822000000837C2408027500837C2408'
	$bData &= '007505E833000000837C2408037500B801000000C20C00680000000068001000'
	$bData &= '006800000000E8CB0F0000A3EC420010E8BB120000E8CE0F0000C3E811000000'
	$bData &= 'E8FB120000FF35EC420010E8AC0F0000C3E871110000C331C050508B54240C8D'
	$bData &= '0C24E8790F00008B5424108D4C2404E86C0F0000FF742414FF742408FF742408'
	$bData &= 'E8BA0F0000EB0231C0FF3424E8DF120000FF742404E8D612000083C408C20C00'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '5251E8B9030000C35251E801040000C3FF25E4400010FF25F0400010FF25F440'
	$bData &= '0010FF25F8400010558BEC51516A088D45F86A0050E8D6FFFFFF83C40C8D45F8'
	$bData &= '50C745F808000000C745FC480B0000FF153C4100106A00FF1544410010C9C356'
	$bData &= '6A01E8A9000000FF742410FF74240CFF742414E84101000050FF15144100106A'
	$bData &= '008BF0E8880000008BC65EC20C005356578B7C24106A0057FF15184100108B1D'
	$bData &= 'FC4000108BF0FFD33BF0755B57FF151C41001085C074506A1468F8420010E8DA'
	$bData &= '010000598BF059897E04FFD36AEC57890666C746080000FF1520410010A80874'
	$bData &= '04C6460801FF15244100103BF8741857FF152841001085C0740D6A0057C64609'
	$bData &= '01FF152C4100105F33C05E405BC208005333DB5657395C24107444FF74241068'
	$bData &= '8E200010FF15304100108B35F84200103BF3747F8B3EFF15FC40001039460875'
	$bData &= '16385E1074116A03535353536AFEFF760CFF15344100108BF73BFB75D7EB548B'
	$bData &= '35F84200103BF3744A558B2E8D7E08FF15FC40001039077533385E11740B6A01'
	$bData &= 'FF760CFF152C410010385E1074116A03535353536AFFFF760CFF153441001057'
	$bData &= '68F8420010E82001000059598BF53BEB75B85D5F5E5BC20400558BEC5156FF15'
	$bData &= '244100108BF085F674188D45FC5056FF1518410010FF15004100103945FC7402'
	$bData &= '33F68BC65EC9C3A1FC42001085C0740650E801000000C3558BEC568B7508837E'
	$bData &= '1400741C56E81B000000EB06FF7508FF56148D45085056E82E00000085C075EC'
	$bData &= '5E5DC204008B4424048B481033D289501889481C3BCA740F3911740B568B0989'
	$bData &= '481C391175F75EC204008B4C2404578B7C240C33C0568B511885D278223B5108'
	$bData &= '7D1D8B710C8D3496833E00740B8B36833E0074048BC68917FF411885C074D75E'
	$bData &= '85C075158B511C85D2740E8D420889078B511C8B520489511C5FC20800FF7424'
	$bData &= '086A08FF35EC420010FF150441001085C074138B4C24048B1185D27407894204'
	$bData &= '8B118910890183C008C38B4424088B4C240483E8088B103901750E89118B0885'
	$bData &= 'C9741783610400EB118B480489118B0885C974068B5004895104506A00FF35EC'
	$bData &= '420010FF1508410010C3CCCCCCCCCCCC558BEC6A0068001000006A00FF15F040'
	$bData &= '0010A304430010C7050043001000000000C7050843001010000000A108430010'
	$bData &= '506A008B0D0443001051FF1504410010A3004000105DC3CCCCCCCCCCCCCCCCCC'
	$bData &= '558BECA100400010506A008B0D0443001051FF15084100108B150443001052FF'
	$bData &= '15F44000105DC3CCCCCCCCCCCCCCCCCC558BEC5052837D080074138B4508506A'
	$bData &= '008B0D0443001051FF15084100105A585DC20400CCCCCCCCCCCCCCCCCCCCCCCC'
	$bData &= '558BEC51837D0C00743D8B450C50E83801000083C4048945FC8B4DFC8D54090A'
	$bData &= '526A00A10443001050FF15044100108B4D0889018B55FC528B450C508B4D088B'
	$bData &= '1152E8B90000008BE55DC20800CCCCCC558BEC51C745FC00000000837D0C0074'
	$bData &= '6C8B450C50E8E100000083C4048945FC8B4D08833900751E8B55FC8D44120A50'
	$bData &= '6A008B0D0443001051FF15044100108B55088902EB228B45FC8D4C000A518B55'
	$bData &= '088B02506A008B0D0443001051FF150C4100108B550889028B45FC508B4D0C51'
	$bData &= '8B55088B0250E835000000EB268B4D08833900741E8B55088B02506A008B0D04'
	$bData &= '43001051FF15084100108B5508C702000000008B45FC8D4400028BE55DC20800'
	$bData &= '558BEC518B45108B4D088D14418955FC837D10007E278B45088B4D0C8B118910'
	$bData &= '8B450883C0048945088B4D0C83C104894D0C8B551083EA02895510EBD333C08B'
	$bData &= '4DFC6689018BE55DC20C00FF25E8400010000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '00000000F3440B53000000003230000001000000010000000100000028300000'
	$bData &= '2C30000030300000771000003830000000006E2E646C6C005075726542617369'
	$bData &= '635F4D7367426F78000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '000000007C400000000000000000000056410000E44000008840000000000000'
	$bData &= '0000000092410000F0400000AC4000000000000000000000A042000014410000'
	$bData &= 'D44000000000000000000000C44200003C410000DC4000000000000000000000'
	$bData &= 'E24200004441000000000000000000000000000000000000000000004C410000'
	$bData &= 'A04100000000000062410000704100007E410000AA410000C0410000D6410000'
	$bData &= 'E2410000EE41000000000000FC4100000A42000026420000384200004A420000'
	$bData &= '6042000072420000824200009042000000000000AC42000000000000D2420000'
	$bData &= '000000004C410000A04100000000000062410000704100007E410000AA410000'
	$bData &= 'C0410000D6410000E2410000EE41000000000000FC4100000A42000026420000'
	$bData &= '384200004A4200006042000072420000824200009042000000000000AC420000'
	$bData &= '00000000D24200000000000099026D656D73657400004D53564352542E646C6C'
	$bData &= '0000A402486561704372656174650000A5024865617044657374726F7900FA01'
	$bData &= '4765744D6F64756C6548616E646C655700004B45524E454C33322E646C6C0000'
	$bData &= 'E6027763736C656E0000AE0147657443757272656E7454687265616449640000'
	$bData &= 'AB0147657443757272656E7450726F63657373496400A20248656170416C6C6F'
	$bData &= '6300A60248656170467265650000A902486561705265416C6C6F630000004D65'
	$bData &= '7373616765426F785700000047657457696E646F7754687265616450726F6365'
	$bData &= '7373496400000000497357696E646F7756697369626C6500000047657457696E'
	$bData &= '646F774C6F6E674100000000476574466F726567726F756E6457696E646F7700'
	$bData &= '0000497357696E646F77456E61626C6564000000456E61626C6557696E646F77'
	$bData &= '00000000456E756D57696E646F777300000053657457696E646F77506F730000'
	$bData &= '5553455233322E444C4C00000000496E6974436F6D6D6F6E436F6E74726F6C73'
	$bData &= '45780000434F4D43544C33322E444C4C00000000436F496E697469616C697A65'
	$bData &= '00004F4C4533322E444C4C000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '00000000F3440B530000000000000100180000001800008000000000F3440B53'
	$bData &= '0000000000000100010000003000008000000000F3440B530000000000000100'
	$bData &= '0904000048000000585000006302000000000000000000003C3F786D6C207665'
	$bData &= '7273696F6E3D22312E302220656E636F64696E673D225554462D382220737461'
	$bData &= '6E64616C6F6E653D22796573223F3E0A3C617373656D626C7920786D6C6E733D'
	$bData &= '2275726E3A736368656D61732D6D6963726F736F66742D636F6D3A61736D2E76'
	$bData &= '3122206D616E696665737456657273696F6E3D22312E30223E0A20203C617373'
	$bData &= '656D626C794964656E746974790A2020202076657273696F6E3D22312E302E30'
	$bData &= '2E30220A2020202070726F636573736F724172636869746563747572653D2258'
	$bData &= '3836220A202020206E616D653D22436F6D70616E794E616D652E50726F647563'
	$bData &= '744E616D652E596F7572417070220A20202020747970653D2277696E33322220'
	$bData &= '2F3E0A20203C6465736372697074696F6E3E3C2F6465736372697074696F6E3E'
	$bData &= '0A20203C646570656E64656E63793E0A202020203C646570656E64656E744173'
	$bData &= '73656D626C793E0A2020202020203C617373656D626C794964656E746974790A'
	$bData &= '2020202020202020747970653D2277696E3332220A20202020202020206E616D'
	$bData &= '653D224D6963726F736F66742E57696E646F77732E436F6D6D6F6E2D436F6E74'
	$bData &= '726F6C73220A202020202020202076657273696F6E3D22362E302E302E30220A'
	$bData &= '202020202020202070726F636573736F724172636869746563747572653D2258'
	$bData &= '3836220A20202020202020207075626C69634B6579546F6B656E3D2236353935'
	$bData &= '623634313434636366316466220A20202020202020206C616E67756167653D22'
	$bData &= '2A22202F3E0A202020203C2F646570656E64656E74417373656D626C793E0A20'
	$bData &= '203C2F646570656E64656E63793E0A0A3C2F617373656D626C793E0000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '00100000100000000C304C3067300000002000007C000000123018301E302430'
	$bData &= '513059307B309A30A030AF30BA30D930E730F2300331203126312C3138315331'
	$bData &= '6131713185319B31A131C031D131D731E831A532AB32FF3205331E3323332933'
	$bData &= '33333C3345334C33513364336D3374337A338133A333AA33E433EB3344344B34'
	$bData &= '68346F349F34A6340D3500000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	Return Binary($bData)
EndFunc

Файл: DllMem UDF

Снимок:

История версий:
v1.0

Источник: autoit-script.ru, Оф. форум
Автор(ы): Ward, Viktor1703
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703,
Жалко, что нет описания у функций. :(
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
madmasles

Там всего 3 функции, остальные вспомогательные.

DllMemOpen - Открывает dll
DllMemClose - Закрывает dll
DllMemGetAddress - Возвращает указатель на функцию в dll

Я думаю из пример понятно как их использовать :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Хорошо бы еще написать небольшую функцию для конвертации DLL в двоичный вид или лучше сразу в готовую функцию, чтобы можно было по быстрому вставить его в AutoIt.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Viktor1703
Можно вопрос. Вам в UDF, что бы загрузить библиотеку в память и вызывать функции, понадобилось около 1000 строк кода. А к примеру в
JSMN библиотеке, как то смогли сделать по проще. Выделили память с флагом $PAGE_EXECUTE_READWRITE и записали туда код. И дальше через DllCallAddress обращались к функциям. Незнаете что за код у них в переменной $Code?
Если его сохранить в бинарный файл, то он не будет открываться в программах типа DLLHelper, dllview итп. Это какой то другой тип библиотек?

И еще один вопрос. Если DLLhelper для функции показывает какой то Relative address, то это и есть адрес функции который годиться для DllCallAddress?
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Yashied

То есть вы имеете ввиду функцию для получения бинарного кода dll?

Код:
Func YouDll()
	Local $bData = '0x'
	$bData &= '4D5A90000300000004000000FFFF0000B8000000000000004000000000000000'
	...............................
	$bData &= '0000000000000000000000000000000000000000000000000000000000000000'
	Return Binary($bData)
EndFunc



Добавлено:
Сообщение автоматически объединено:

inververs

То что находится в $Code - это ОП код, в моём понимании это готовая функция в машинных кодах в область памяти с флагом $PAGE_EXECUTE_READWRITE записывают этот код для того что бы его выполнить, потому и строк кода меньше, да и в DllMem было бы меньше если не использовать проверки на возвращённые результаты и @error'ы
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
Хорошо бы еще написать небольшую функцию для конвертации DLL в двоичный вид или лучше сразу в готовую функцию, чтобы можно было по быстрому вставить его в AutoIt.
Триста лет назад писал, вроде работает. :smile:
Код:
$iLen = 128

$sFile = FileOpenDialog('Выберите файл DLL', @ScriptDir & '\', 'Файлы DLL(*.dll)', 1)
If Not $sFile Then Exit
$hFile = FileOpen($sFile, 16)
$sText = FileRead($hFile)
FileClose($hFile)
$sText = Hex($sText)
$iBytes = StringLen($sText)
$iInt = Int($iBytes / $iLen)
$iEnd = Mod($iBytes, $iLen)
$sFuncName = '_' & StringUpper(StringRegExpReplace($sFile, '^.*\.', '')) & '_' & _
		StringRegExpReplace(StringReplace($sFile, '-', '_'), '.*\\|\.[^.]*$', '')
$bResult = "Func " & $sFuncName & "()" & @LF
$bResult &= @TAB & "Local $sCode = '0x'" & @LF
For $i = 1 To $iInt
	$bResult &= @TAB & "$sCode &= '" & StringLeft($sText, $iLen) & "'" & @LF
	$sText = StringTrimLeft($sText, $iLen)
Next
If $iEnd Then
	$bResult &= @TAB & "$sCode &= '" & StringLeft($sText, $iEnd) & "'" & @LF
EndIf
$bResult &= @TAB & "Return Binary($sCode)" & @LF & "EndFunc   ;==>" & $sFuncName
$sFileNew = @ScriptDir & '\' & StringRegExpReplace($sFile, '.*\\|\.[^.]*$', '') & '.au3'
$hFileNew = FileOpen($sFileNew, 2)
FileWrite($hFileNew, $bResult)
FileClose($hFileNew)
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
madmasles [?]
Именно они меня и интересуют.

Дело в том, что функции

Код:
; __memlib_Load
	; __memlib_BuildImportTable
	; __memlib_FinalizeSections
	; __memlib_PerformBaseRelocation
	; __memlib_CopySections
	; __memlib_GetExportList
	; __memlib_Free
	; __memlib_GetDword
	; __memlib_GetWord
	; __memlib_SetWord
	; __memlib_AddRef
	; __memlib_GetIndex
	; __memlib_Release
	; __memlib_SetDataToMem
	; __memlib_GetDataFromMem
	; __memlib_GetPtrFromMem
	; __memlib_SetPtrToMem
	; __memlib_Valid


Самописные и работают только в сочетании с функциями DllMemOpen, DllMemClose, DllMemGetAddress, вряд ли у вас будет именно тот случай в котором нужно будет применить одну из приведённых выше функций, остальные взяты из UDF Memory.au3, WinAPIEx.au3

madmasles [?]
Триста лет назад писал, вроде работает.
smiley.gif

Я как раз этим кодом и пользовался :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703,
Бог с ними, с описаниями, надо будет, надеюсь, сам разберусь.

ИМХО, было бы лучше, следую общепринятым правилам, изменить названия функций с DllMemOpen, DllMemClose, DllMemGetAddress на _DllMemOpen, _DllMemClose, _DllMemGetAddress.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
madmasles [?]
ИМХО, было бы лучше, следую общепринятым правилам, изменить названия функций с DllMemOpen, DllMemClose, DllMemGetAddress на _DllMemOpen, _DllMemClose, _DllMemGetAddress.

Было бы лучше.. если нужно, то переименую и перезалью :ok:, но мне почему - то не нравятся функции начинающиеся с '_'


Добавлено:
Сообщение автоматически объединено:

Перезалил
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703,
У Вас есть функция __memlib_Load($iIndex, $bData), в которой используется куча If ... EndIf. Я обычно (подсмотрел давно у Yashied`а) использую следующую конструкцию:
Код:
;~ ...
Local $i_Err = 1, $i_Ret
;~ ...

Do
	_Func1()
	If @error Then ExitLoop
	$i_Err += 1
	_Func2()
	If @error Then ExitLoop
	$i_Err += 1
	_Func3()
	If @error Then ExitLoop
	$i_Err += 1
	_Func4()
	If @error Then ExitLoop
	$i_Err += 1
	_Func5()
	If @error Then ExitLoop
	$i_Err += 1
	_Func6()
	If @error Then ExitLoop
	$i_Err = 0
Until 1
;~ здесь закрываю, освобождаю, если есть что
If $i_Err Then
	Return SetError($i_Err, 0, 0)
EndIf
;~ какие-то действия, если нет ошибки
Return $i_Ret ;Or Return SetExtended()
;~ ...



Еще в других функциях Вы в цикле создаете структуру несколько раз по одному и тому же адресу, а это, ИМХО, лишние операции, можно создать ее один раз перед входом в цикл.

Не понятна конструкция в функции __memlib_CopySections($pCodeBase, $pPeHeader, $pBuffer)
Код:
;~ ...
$pSec = ($pPeHeader + (DllStructGetPtr($tInh, 'Magic') - $pPeHeader) + DllStructGetData($tInh, 'SizeOfOptionalHeader'))
;~ ...
Зачем здесь $pPeHeader + и - $pPeHeader?
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
madmasles

Конечно было бы хорошо, но я пока не привык к такому стилю написания :smile:


Добавлено:
Сообщение автоматически объединено:

madmasles

Я не автор, я просто переписал и немного модифицировал UDF, раз оно там было, значит оно надо, вот например в ходе переписывания столкнулся с такой вещью, например сравнивание

Код:
;~ Было 

If $iVar = 0 Then
	ExitLoop
EndIf

;~ Переделал

If ($iVar == 0) Then
	ExitLoop
EndIf


а вот 2-й вариант не работает, точнее функция в которой он находится, работает не корректно и возвращает ошибку, я не знаток PE файлов и его структур, но понимаю, что даже мелочь может вывести всю программу из строя, по этому в работе с PE файлами нужно быть фантастически внимательным, да и в программировании в целом :smile:
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Viktor1703
Мне кажеться вы чтото в коде путаете
http://autoit-script.ru/autoit3_docs/keywords/For.htm
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703 [?]
в ходе переписывания столкнулся с такой вещью, например сравнивание
OffTopic:
Наверное не For, а If.

Не понятно, чему равна $iVar, если False, то Ваш вариант не сработает. Простой пример:
Код:
Local $iRet

For $j = 0 To 4
	For $i = 1 To 4
		$iRet = _Test($j)
		ConsoleWrite('$iRet: ' & $iRet & @LF)
		If Not $iRet Then ExitLoop
	Next
	ConsoleWrite('$i = ' & $i & @LF)
	ConsoleWrite('---' & @LF)
Next

Func _Test($i_Ind)
	Local $a_Ret[5] = [False, True, 0, 1, -1]
	Switch $i_Ind
		Case 0 To 4
			Return $a_Ret[$i_Ind]
		Case Else
			Return 13
	EndSwitch
EndFunc   ;==>_Test
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Почему-то не работает с dll, написанными на Freebasic

Код:
#include <DllMem.au3>

Local $DllPath = 'C:\Test.dll'

Local $DllFile = FileOpen($DllPath, 16)
Local $DllBin = FileRead($DllFile)
FileClose($DllFile)

Local $hDllMem1 = _DllMemOpen($DllBin)

ConsoleWrite($hDllMem1 & @LF)
_DllMemClose($hDllMem1)


Local $dllname1 = 'C:\Test.dll'
Local $dll1 = DllOpen($dllname1)
Local $ret = DllCall($dll1, 'int', '_Init')
ConsoleWrite($ret[0] & @LF)


Во вложении - dll, там одна функция _Init без параметров, возвращает число 25.

А MemoryDll.au3 работает, но хотелось бы один бинарный файл dll подгружать несколько раз.
 

Вложения

  • Test.zip
    5.1 КБ · Просмотры: 7

sims

Осваивающий
Сообщения
184
Репутация
24
WSWR [?]
хотелось бы один бинарный файл dll подгружать несколько раз
Одну dll несколько раз? Зачем? Библиотека загружается только один раз, даже если она используется несколькими программами.
Из википедии.
Первоначально предполагалось, что введение DLL позволит эффективно организовать память и дисковое пространство, используя только один экземпляр библиотечного модуля для различных приложений. Это было особенно важно для ранних версий Microsoft Windows с жёсткими ограничениями по памяти.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
sims сказал(а):
Одну dll несколько раз? Зачем? Библиотека загружается только один раз, даже если она используется несколькими программами.
Из-за особенностей одной из функций Freebasic- в коде она может быть использована только 1 раз, но ограничение можно обойти, вынося код в dll.
К скрипту нужно подключить, допустим, 10 таких dll - вот я и подумал, что данная UDF позволит добавить все эти файлы в скомпилированный скрипт.
 

sims

Осваивающий
Сообщения
184
Репутация
24
Что за функция и почему ее потребовалось вызывать больше раза?
Наверное не просто так нельзя ее повторно вызывать.
 
Верх