В силу специфики работы имеется куча исполняемых файлов, которые очень плохо взаимодействовали с фаром в Conemu, то экран уплывет, то темноту показывает,
В общем приложения использующие NTVDM в отдельных окнах довольно хорошо себя вели, появилась идея проверять заголовок, и уже от него менять повдение запуска. Изначально было реализовано через внешнюю самописную на перле утилитку.
В принципе можно переделать скрипт под любые нужды, например под запуск старых файлов в дос бокс, либо каких то других сред виртуализации, либо оповещения пользователя. Так же если немного дописать скрипт, можно развить идею и самостоятельно проверять разрядность, но мне не надо пока.
про вопрос почему бы просто не пользовать DOSBOX = потому что используемые программы еще и сетевые, да еще чрз движок первасайва, покажите как это сэмулировать.
Macro { area="Shell"; key="AltF3"; flags=" NoFolders NoPluginPanels NoSelection"; description="!Run in new window";
condition = function() return
FMask("*.exe,*.com,*.bat,*.cmd") end;
action = function()
new_wnd();
end;
}
Macro { area="Shell"; key="AltF3"; flags=" NoFolders NoPluginPanels NoSelection"; description="!Run in new Conemu window";
condition = function() return
FMask("*.exe,*.com,*.bat,*.cmd") end;
action = function()
new_wnd(true);
end;
}
Macro { area="Shell"; key="Enter"; flags=" NoFolders NoPluginPanels NoSelection EmptyCommandLine"; description="!ntvdm OLD autorun ";
condition = function() return
FMask("*.exe") and not check_PE(APanel.Current) end;
action = function()
new_wnd();
end;
}
function new_wnd (mode)
-- ПРОПИСАНЫ МОИ ПЕРЕМЕННЫЕ!! порядок имеет значение, многие старые приложения падают если в %path% больше 250 (dos4gw) или имеются пробелы или кирилица
p="C:\\Program Files\\Pervasive Software\\PSQL\\bin;"..win.GetEnv("SystemRoot")..";"..win.GetEnv("SystemRoot").."\\system32;"..win.GetEnv("SystemRoot").."\\system32\\Wbem;";
if mode then
os.execute(win.GetEnv("FARHOME").."\\Conemu.exe -NoCloseConfirm -size 40 -Single -Run cmd /C \"set path="..p.." && "..APanel.Current)
else
os.execute("start cmd /K \"set path="..p.." && "..APanel.Current .."")
end
end;
function check_PE(path)
require "struct"
local fh=io.open(path,'rb')
block=fh:read(2)
local magic = struct.unpack('c2', block)
if magic == "MZ" then
fh:seek('cur',58)
block=fh:read(4)
local offset = struct.unpack('i', block)
fh:seek('set',offset)
block=fh:read(2)
local sig = struct.unpack('c2', block)
if sig == "PE" then
--здесь хранится тип машины
-- fh:seek("cur",2)
-- block=fh:read(2)
-- machine = struct.unpack('H', block)
fh:close()
return true
else
fh:close()
-- msgbox("Not PE")
return false
end
else
fh:close()
msgbox("Not an executable")
return false
end
end;
инфо:
обрабатывается только запуск по большому Enter или AltF3
только файл под курсором
переменная %path% подменяется
если кто подскажет как клик мышью по простому привязать - буду благодарен.
ну про интеллектуальную обработку ком строки вообще молчу
з.ы. кстати удалось запустить большинство приложений под х64, с ломаным NTVDM http://www.columbia.edu/~em36/ntvdmx64.html, что интересно при запуске в консоле фара (даже без конемы) большинство из них как то странно крашилось, а с таким запуском работали
Last edited by Shtirla on Mon 21 Jan, 2019 12:51, edited 1 time in total.