Новичок
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.5.2010
Репутация: нет Всего: нет
|
Доброго времени суток. Есть dll в которой я ставлю хук на клавиатуру и в этой же dll есть форма. в функции хука проверяется нажатая клавиша и если нажата нужная, то мы либо показываем либо скрываем форму. Показ формы проходит успешно всегда а вот при ее скрытии возникает ошибка Exception EAccessViolation in module lib2.dll at FF63F386. AccessViolation at address FF640386. Read of address FF640386причем иногда она не возникает а иногда возникает. И еще заметил одну вешь. Если я цепляю dll к блокноту, то ошибка не возникает вообще. А если например к тотал командер или L2.exe то возникает. Приведу ниже код: dll: | Код | library lib2;
uses windows, // messages, forms, // classes, sysutils, // shellapi, // inifiles, // registry, main in 'main.pas' {Form2}; const MMFName: PChar = 'MyMMF'; // èìÿ îáúåêòà ôàéëîâîãî îòîáðàæåíèÿ
{ñòðóêòóðà, ïîëÿ êîòîðîé áóäóò îòîáðàæåíû â ôàéë ïîäêà÷êè} type PGlobalDLLData = ^TGlobalDLLData; TGlobalDLLData = packed record theHook : THandle; theHook2 : THandle; appHandle:hwnd; // SysHook: HWND; // äåñêðèïòîð óñòàíîâëåííîé ëîâóøêè end;
var // theHook : THandle; // theHook2 : THandle; // appHandle:hwnd; GlobalData: PGlobalDLLData; MMFHandle: THandle; lk:HWND; pt : TPoint; //theHook : THandle; visibled,gvisibled:boolean; game_handle, gmWindow,botWindow:hwnd; bot_handle:hwnd = 0; //list: tstringlist; this_pr,this_pk:word; //ggg:string; f:textfile;
function GetProcessId(hp: HWND): DWORD; stdcall; external 'Kernel32.dll';
function ProcCloseEnum2(hwnd:THandle;data:pointer):BOOL;stdcall; var pid:DWORD; f:textfile; a:pchar; aName: array[0..255] of Char; begin Result:=true; GetWindowThreadProcessId(hwnd,pid); if pid=DWORD(data) then begin GetClassName(hwnd, aName, SizeOf(aName)); // Handle ìîæíî óçíàòü ÷åðåç FindWindow è áåç èìåíè êëàññà... if aName='TForm2' then if botWindow=0 then botWindow:=hwnd; if aName='TForm2' then begin if IsWindowVisible(hwnd)=true then begin ShowWindow(botWindow,SW_HIDE); end else begin ShowWindow(botWindow,SW_SHOW); end; //pr:=24; end; end; end;
procedure BotShowing(pr:word; hp: word); begin EnumWindows(@ProcCloseEnum2,GetProcessId(hp)); end;
function getVisible:boolean; begin Result:=gvisibled; end;
procedure setVisible; begin if gvisibled=false then gvisibled:=true else gvisibled:=false; end;
////////////////////////////// procedure OpenGlobalData(); begin {ïîëó÷àåì îáúåêò ôàéëîâîãî îòîáðàæåíèÿ} // MMFHandle:= CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName); // ìîæíî òàê, íî ëó÷øå: ñì. ñëåä. ñòðîêó MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName); if MMFHandle = 0 then MessageBox(0, 'Can''t create FileMapping', 'Message from Exampel2/Process1', 0); {îòîáðàæàåì ãëîáàëüíûå äàííûå íà ÀÏ âûçûâàþùåãî ïðîöåññà è ïîëó÷àåì óêàçàòåëü íà íà÷àëî âûäåëåííîãî ïðîñòðàíñòâà} GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData)); if GlobalData = nil then begin CloseHandle(MMFHandle); MessageBox(0, 'Can''t make MapViewOfFile', 'Message from Exampel2/Process1', 0); end; end;
procedure CloseGlobalData(); begin UnmapViewOfFile(GlobalData); CloseHandle(MMFHandle); end; /////////////////////////////
function KeyHook(nCODE, WParam, LParam: DWORD): DWORD; stdcall; var ServerWnd: THandle; ScanCode:integer; // ini:TIniFile; s2:integer; path:string; // reg:tregistry; wnd:word; hhh:LongBool; hProc:hwnd; prId:dword; hInst:Cardinal; hwnd:word; begin if nCode<0 then begin result := CallNextHookEx(GlobalData^.theHook, nCode, wParam, lParam); exit; end; if nCODE = HC_ACTION then begin //0 if ((LParam or (1 shl 30))=LParam) then begin //1 ScanCode:=(LParam shr 16)and $FF; if ScanCode=71 then begin //2 try if (IsWindowVisible(form2.Handle)=true) and (visibled=false) then visibled:=true; if (IsWindowVisible(form2.Handle)=false) and (visibled=true) then visibled:=false; except end; if visibled=false then begin //3 try ShowWindow(form2.Handle,SW_SHOW); form2.Visible:=true; except lk:=GetActiveWindow; Application.CreateForm(tform2,form2); form2.Visible:=true; form2.Caption:=inttostr(GetWindowThreadProcessId(lk)); form2.Tag:=lk; end; visibled:=true; end else begin //3
// form2.Visible:=false; ShowWindow(form2.Handle,SW_HIDE); visibled:=false; end; //3 end; //2 end;//1 end;//0 // messageBox(0,pchar(inttostr(nCode)),'go!',mb_ok); result := CallNextHookEx(GlobalData^.theHook, nCode, wParam, lParam);
//sleep(10); end;
function ProcCloseEnum(hwnd:THandle;data:pointer):BOOL;stdcall; var pid:DWORD; f:textfile; a:pchar; aName: array[0..255] of Char; begin Result:=true; GetWindowThreadProcessId(hwnd,pid); if pid=DWORD(data) then begin
if (IsWindowVisible(hwnd)=true) then begin GetClassName(hwnd, aName, SizeOf(aName)); // Handle ìîæíî óçíàòü ÷åðåç FindWindow è áåç èìåíè êëàññà... if aName<>'TForm2' then if gmWindow=0 then gmWindow:=hwnd; end;
if gvisibled=false then ShowWindow(gmWindow,SW_HIDE) else ShowWindow(gmWindow,SW_SHOW);
end; end;
procedure show_hide_gw(pr:word; hp: word); begin EnumWindows(@ProcCloseEnum,GetProcessId(hp)); if gvisibled=false then gvisibled:=true else gvisibled:=false; end;
procedure Start(threadId:word;handle:hwnd;handle2:hwnd); begin this_pr:=threadId; this_pk:=handle; pr:=threadId; pk:=handle; game_handle:=handle; //GlobalData^.theHook2 := SetWindowsHookEx(WH_SHELL, @ShellHook, HInstance, threadId); GlobalData^.theHook := SetWindowsHookEx(WH_KEYBOARD, @keyHook, HInstance, threadId);
if GlobalData^.theHook = 0 then messageBox(0,'Error!','Error!',mb_ok); gmWindow:=0; GlobalData^.appHandle:=threadId; end;
procedure Remove; begin messageBox(0,'unhook!','unhook!',mb_ok); UnhookWindowsHookEx(GlobalData^.theHook); end;
procedure DLLEntryPoint(dwReason: DWord); stdcall; begin case dwReason of DLL_PROCESS_ATTACH: begin OpenGlobalData; end; DLL_PROCESS_DETACH: CloseGlobalData; end; end;
exports Start index 1 name 'Start', Remove index 2 name 'Remove', getVisible index 3 name 'getVisible', setVisible index 4 name 'setVisible', BotShowing index 5 name 'BotShowing', show_hide_gw index 6 name 'show_hide_gw'; begin //MessageBox(0, PChar(Application.ExeName), 'Message from Exampel1/Process1', 0); {íàçíà÷èì ïîöåäóðó ïåðåìåííîé DLLProc} DLLProc:= @DLLEntryPoint; {âûçûâàåì íàçíà÷åííóþ ïðîöåäóðó äëÿ îòðàæåíèÿ ôàêòà ïðèñîåäèíåíèÿ äàííîé áèáëèîòåêè ê ïðîöåññó} DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
|
Форма в dll: | Код | unit main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, Mask, bsSkinBoxCtrls, bsSkinCtrls, Buttons;
type TForm2 = class(TForm) Panel1: TPanel; ListBox1: TListBox; Image1: TImage; Image2: TImage; Image3: TImage; other_ctrl: TPanel; GroupBox1: TGroupBox; TrackBar1: TTrackBar; GroupBox2: TGroupBox; SpeedButton1: TSpeedButton; GroupBox3: TGroupBox; GroupBox4: TGroupBox; GroupBox5: TGroupBox; GroupBox6: TGroupBox; Label1: TLabel; Label2: TLabel; SpeedButton2: TSpeedButton; ComboBox1: TComboBox; ComboBox2: TComboBox; SpeedButton3: TSpeedButton; Memo1: TMemo; SpeedButton4: TSpeedButton; SpeedButton6: TSpeedButton; CheckBox1: TCheckBox; SpeedButton5: TSpeedButton; procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure ListBox1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure TrackBar1Change(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; procedure show_hide_gw(pr:word; hp: word); external 'lib2.dll' name 'show_hide_gw'; function getVisible:boolean;external 'lib2.dll' name 'getVisible'; procedure setVisible;external 'lib2.dll' name 'setVisible'; var Form2: TForm2; pr,pk:word; implementation
{$R *.dfm}
procedure CenterText(Cnv: TCanvas; Rect: TRect; S: string); var X, Y: Integer; begin X := (Rect.Right + Rect.Left - Cnv.TextWidth(S)) div 2; Y := (Rect.Bottom + Rect.Top - Cnv.TextHeight(S)) div 2; Cnv.TextOut(X, Y, S); end;
procedure TForm2.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var s, s1, s2: string; bitmap:TBitmap; i: integer; H: HDC; align:cardinal; begin s:=TListBox(Control).Items[Index]; TListBox(Control).Canvas.FillRect(Rect); //ShowMessage(s); if Index in [0,6,12,18,26,30] then align:=DT_CENTER ELSE align:=DT_LEFT; if Index in [0,6,12,18,26,30] then begin TListBox(Control).Canvas.Font.Style:=[fsBold,fsbold,fsbold,fsbold]; ListBox1.Canvas.Brush.Style:=bsClear; Bitmap := Image1.Picture.Bitmap; ListBox1.Canvas.BrushCopy(Bounds(Rect.Left,Rect.Top, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed); end; h:=TListBox(Control).Canvas.Handle; if Index in [0,6,12,18,26,30] then CenterText(ListBox1.Canvas,rect,s) else DrawText(H, PChar(s), Length(s), Rect, align or DT_VCENTER);
//TListBox(Control).Canvas.Brush.Style:=bsVertical; //DrawText(H, PChar(s), Length(s), Rect, align or DT_VCENTER); end;
procedure TForm2.ListBox1Click(Sender: TObject); var Caption_:string; begin if ListBox1.ItemIndex in [0,6,12,18,26,30] then ListBox1.ItemIndex:=ListBox1.ItemIndex+1; Caption_:=' '+ListBox1.Items.Strings[ListBox1.itemindex]; Image2.Canvas.FillRect(Image2.ClientRect); Image2.Canvas.Brush.Style:=bsClear; Image2.Canvas.BrushCopy(Bounds(0,0,image3.Width, Image3.Height), Image3.Picture.Bitmap, Bounds(0, 0, Image2.Width, image2.Height), clRed);; Image2.Canvas.Font.Size:=10; Image2.Canvas.Font.Style:=[fsBold,fsBold,fsBold,fsBold]; Image2.Canvas.TextOut(0,8,Caption_); end;
procedure TForm2.FormCreate(Sender: TObject); begin //ShowWindow(Form2.Handle, sw_Hide); ListBox1.ItemIndex:=1; ListBox1.OnClick(nil); SetWindowLong(Application.Handle, GWL_EXSTYLE, NOT WS_EX_APPWINDOW); end;
procedure TForm2.TrackBar1Change(Sender: TObject); begin form2.AlphaBlendValue:=TrackBar1.Position; end;
procedure TForm2.SpeedButton1Click(Sender: TObject); var r:boolean; begin //ShowMessage(inttostr(pr)); //show_hide_gw(strtoint(form2.Caption),form2.Tag); r:=getVisible; //ShowMessage(vartostr(r)); if r=false then ShowWindow(form2.Tag,SW_HIDE) else ShowWindow(form2.Tag,SW_SHOW); setvisible; end;
end.
|
Программа подгрузчик dll: | Код | unit starter;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ImgList, Buttons, TrayIcon, Menus,inifiles,shellapi, jpeg,registry;
type TForm1 = class(TForm) Panel1: TPanel; Panel2: TPanel; Edit1: TEdit; Label1: TLabel; SpeedButton1: TSpeedButton; ImageList1: TImageList; Label2: TLabel; CheckBox1: TCheckBox; CheckBox2: TCheckBox; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; SpeedButton4: TSpeedButton; TrayIcon1: TTrayIcon; PopupMenu1: TPopupMenu; RunGame1: TMenuItem; ShowHide1: TMenuItem; Exit1: TMenuItem; OpenDialog1: TOpenDialog; Image1: TImage; PopupMenu2: TPopupMenu; ShowHideGamewindow1: TMenuItem; ShowHideWalkerwindow1: TMenuItem; ExitGameandWalker1: TMenuItem; Timer1: TTimer; procedure SpeedButton2Click(Sender: TObject); procedure SpeedButton3Click(Sender: TObject); procedure TrayIcon1DblClick(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure ShowHide1Click(Sender: TObject); procedure TrayIcon1Click(Sender: TObject); procedure RunGame1Click(Sender: TObject); procedure SpeedButton4Click(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); procedure ExitGameandWalker1Click(Sender: TObject); procedure ShowHideWalkerwindow1Click(Sender: TObject); procedure ShowHideGamewindow1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; procedure Start(threadId:word;handle:hwnd;self:hwnd); external 'lib2.dll' name 'Start'; procedure Remove; external 'lib2.dll' name 'Remove'; procedure show_hide_gw(pr:word; hp: word); external 'lib2.dll' name 'show_hide_gw'; procedure destroy_all; external 'lib2.dll' name 'destroy_all'; procedure BotShowing(pr:word; hp: word); external 'lib2.dll' name 'BotShowing'; var Form1: TForm1; StartInfo: TStartupInfo; ProcInfo: TProcessInformation; pr,pk:variant; inGame:boolean; implementation
{$R *.dfm} function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall; var nCode, ctrlID : word; Begin case msg of wm_destroy : Begin Remove;//óäàëÿåì ÍÎÎÊ postquitmessage(0); exit; Result:=0; End;
else Result:=DefWindowProc(wnd,msg,wparam,lparam); end; End;
procedure TForm1.SpeedButton2Click(Sender: TObject); begin close; end;
procedure TForm1.SpeedButton3Click(Sender: TObject); begin Form1.Visible:=false; end;
procedure TForm1.TrayIcon1DblClick(Sender: TObject); begin if inGame=false then Form1.Show else //ShowMessage(inttostr(pk)); show_hide_gw(pr,pk); end;
procedure TForm1.Exit1Click(Sender: TObject); begin form1.close; end;
procedure TForm1.ShowHide1Click(Sender: TObject); begin if form1.Visible=true then form1.Visible:=false else form1.Visible:=true; end;
procedure TForm1.TrayIcon1Click(Sender: TObject); begin if inGame=false then PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else PopupMenu2.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y); end;
procedure TForm1.RunGame1Click(Sender: TObject); begin SpeedButton4.Click; end;
procedure TForm1.SpeedButton4Click(Sender: TObject); var wc : TWndClassEx; MainWnd: THandle; Mesg : TMsg; lk:hwnd; begin inGame:=true; TrayIcon1.PopupMenu:=PopupMenu2; form1.PopupMenu:=PopupMenu2; form1.Visible:=false; CreateProcess(nil, 'c:\program files\total commander\totalcmd.exe', nil, nil, False, 0, nil, nil, StartInfo, ProcInfo); pr:=ProcInfo.dwThreadId; pk:=ProcInfo.hProcess; Timer1.Enabled:=true; sleep(1000);
Start(pr,pk,Application.Handle);//âñòàâëÿåì ÍÎÎÊ
end;
procedure TForm1.SpeedButton1Click(Sender: TObject); begin if OpenDialog1.Execute then Edit1.Text:=OpenDialog1.FileName; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var ini:TIniFile; begin ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'set.ini'); ini.WriteString('PATH','L2_PATH',Edit1.Text); ini.Free; end;
procedure TForm1.FormCreate(Sender: TObject); var ini:TIniFile; reg:TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey('\Software', True) then begin // for i:=1 to 4 do buf[i]:=0; // buf[0]:=1; reg.WriteString('xxlPath',ExtractFilePath(Application.ExeName)); // Reg.WriteBinaryData('Value', buf, sizeof(buf)); Reg.CloseKey; end; finally Reg.Free; inherited; end;
ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'set.ini'); Edit1.Text:=ini.ReadString('PATH','L2_PATH',''); ini.Free; inGame:=false; end;
procedure TForm1.ExitGameandWalker1Click(Sender: TObject); begin //destroy_all; //ExitProcess(pk); TerminateProcess(pk,0); Close; end;
procedure TForm1.ShowHideWalkerwindow1Click(Sender: TObject); begin BotShowing(pr,pk); //SetVisible2; //show_hide_gw; end;
procedure TForm1.ShowHideGamewindow1Click(Sender: TObject); begin show_hide_gw(pr, pk); end;
procedure TForm1.Timer1Timer(Sender: TObject); var exitCode:cardinal; begin GetExitCodeProcess(pk, ExitCode); if ExitCode<>STILL_ACTIVE then begin Remove; close; end; end;
end.
|
На всякий случай прикладываю исходники полностью.
Присоединённый файл ( Кол-во скачиваний: 3 )
XXL2Walker.zip 131,50 Kb
|