InitAndFina.pas
上传用户:xiuanze55
上传日期:2017-08-03
资源大小:1080k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit InitAndFina;
  2. interface
  3. uses SysUtils, Windows, Classes, madCodeHook;
  4. //const  MAPFILESIZE = 8;
  5. type
  6.   ShareData=record
  7.     dwTotalBytes: DWORD;
  8.     intProcessCount: Integer;
  9.     boNewRule: Array[0..512] of Byte;
  10.   end;
  11. var
  12.   //Rules :Array of String;
  13.   Rules :TStringList=nil;
  14.   DllPath: array[0..MAX_PATH-1] of char='';
  15.   //Share Memory: Total Bytes via Network.
  16.   HMapping: THandle;
  17.   //HMapMutex: THandle;
  18.   PMapData: ^ShareData=nil;
  19.   MapOpened: Boolean=False;
  20.   MyProcessID: Integer=0;
  21. procedure OpenMap();
  22. procedure CloseMap();
  23. function ToLongPath(AFileName: PChar; BufSize: Integer): PChar;
  24. implementation
  25. //Share Memory******************************************************************
  26. procedure OpenMap;
  27. var
  28.   llInit: Boolean;
  29. begin
  30.   try
  31.   MapOpened:=True;
  32.   HMapping := CreateFileMapping(THandle($FFFFFFFF), nil, PAGE_READWRITE, 0, SizeOf(ShareData), pchar('PSMFWShareM'));
  33.   // Check if already exists
  34.   llInit := (GetLastError() <> ERROR_ALREADY_EXISTS);
  35.   if (hMapping = 0) then begin
  36.     //SendIpcMessage('PSMFirewall', Pchar(' hMapping = 0'),Length(' hMapping = 0')+1,nil,0,IGNORE, TRUE);
  37.     SendIpcMessage('PSMFirewall', Pchar(' hMapping = 0'),Length(' hMapping = 0')+1,nil,0);
  38.     SysUtils.Beep;
  39.     exit;
  40.   end;
  41.   PMapData := MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  42.   if PMapData = nil then begin
  43.     CloseHandle(HMapping);
  44.     //SendIpcMessage('PSMFirewall', Pchar(' PMapData = nil'),Length(' PMapData = nil')+1,nil,0,IGNORE, TRUE);
  45.     SendIpcMessage('PSMFirewall', Pchar(' PMapData = nil'),Length(' PMapData = nil')+1,nil,0);
  46.     SysUtils.Beep;
  47.     exit;
  48.   end;
  49.   if (llInit) then begin//First one to create MAP
  50.     PMapData^.dwTotalBytes:=0;  
  51.     PMapData^.intProcessCount:=0;
  52.   end else begin
  53.     PMapData^.intProcessCount:=(PMapData^.intProcessCount+1) mod 512;
  54.   end;
  55.   MyProcessID:=PMapData^.intProcessCount;
  56.   PMapData^.boNewRule[MyProcessID]:=PMapData^.boNewRule[0];
  57.   except
  58.     SendIpcMessage('PSMFirewall', Pchar(' Error at OpenMap()'),length(' Error at OpenMap()') +1,nil,0);
  59.     SysUtils.Beep;
  60.   end;
  61. end;
  62. procedure CloseMap;
  63. begin
  64.   MapOpened:=False;
  65.   try
  66.   if PMapData <> nil then begin
  67.     PMapData^.dwTotalBytes:=0;
  68.     PMapData^.intProcessCount:=0;
  69.     PMapData^.boNewRule[MyProcessID]:=0;//=1: Have New Rules, =2: Stop FW, =0: FW is running and have no new rules.    
  70.     UnMapViewOfFile(PMapData);
  71.     PMapData:=nil;
  72.   end;
  73.   if HMapping <> 0 then begin
  74.     CloseHandle(HMapping);
  75.     HMapping:=0;
  76.   end;
  77.   except
  78.     SendIpcMessage('PSMFirewall', Pchar(' Error at CloseMap()'),length(' Error at CloseMap()') +1,nil,0);  
  79.     SysUtils.Beep;
  80.   end;
  81. end;
  82. {
  83. function LockMap:Boolean;//=True if Success or TimeOut
  84. begin
  85.   Result := true;
  86.   HMapMutex := CreateMutex(nil, false, pchar('PSMFirewallShareMemMutex'));
  87.   if HMapMutex = 0 then begin
  88.     Result := false;
  89.   end else begin
  90.     if WaitForSingleObject(HMapMutex,REQUEST_TIMEOUT) = WAIT_FAILED then begin
  91.       Result := false;
  92.     end;
  93.   end;
  94. end;
  95. procedure UnlockMap;
  96. begin
  97.   ReleaseMutex(HMapMutex);
  98.   CloseHandle(HMapMutex);
  99. end;
  100. }
  101. //******************************************************************************
  102.   function FindBS(Current: PChar): PChar;
  103.   begin
  104.     Result := Current;
  105.     while (Result^ <> #0) and (Result^ <> '') do
  106.       Result := CharNext(Result);
  107.   end;
  108. {
  109. function GetFullPathName(lpFileName: PChar; nBufferLength: LongWord;
  110.   lpBuffer: PChar; var lpFilePart: PChar): LongWord; stdcall;
  111.   external 'kernel32.dll' name 'GetFullPathNameA';
  112. }
  113.   function ToLongPath(AFileName: PChar; BufSize: Integer): PChar;
  114.   var
  115.     //CurrBS, NextBS: PChar;
  116.     Handle: Integer;//L: Integer;
  117.     //FindData: TWin32FindData;
  118.     Buffer: array[0..MAX_PATH] of Char;
  119.     GetLongPathName: function (ShortPathName: PChar; LongPathName: PChar;
  120.       cchBuffer: Integer): Integer stdcall;
  121.   begin
  122.     Result := AFileName;
  123.     Handle := GetModuleHandle('kernel32.dll');
  124.     if Handle <> 0 then
  125.     begin
  126.       @GetLongPathName := GetProcAddress(Handle, 'GetLongPathNameA');
  127.       if Assigned(GetLongPathName) and
  128.         (GetLongPathName(AFileName, Buffer, SizeOf(Buffer)) <> 0) then
  129.       begin
  130.         lstrcpyn(AFileName, Buffer, BufSize);
  131.         Exit;
  132.       end;
  133.     end;
  134.     {
  135.     if AFileName[0] = '' then
  136.     begin
  137.       if AFileName[1] <> '' then Exit;
  138.       CurrBS := FindBS(AFileName + 2);  // skip server name
  139.       if CurrBS^ = #0 then Exit;
  140.       CurrBS := FindBS(CurrBS + 1);     // skip share name
  141.       if CurrBS^ = #0 then Exit;
  142.     end else
  143.       CurrBS := AFileName + 2;          // skip drive name
  144.     L := CurrBS - AFileName;
  145.     lstrcpyn(Buffer, AFileName, L + 1);
  146.     while CurrBS^ <> #0 do
  147.     begin
  148.       NextBS := FindBS(CurrBS + 1);
  149.       if L + (NextBS - CurrBS) + 1 > SizeOf(Buffer) then Exit;
  150.       lstrcpyn(Buffer + L, CurrBS, (NextBS - CurrBS) + 1);
  151.       Handle := FindFirstFile(Buffer, FindData);
  152.       if (Handle = -1) then Exit;
  153.       FindClose(Handle);
  154.       if L + 1 + strlen(FindData.cFileName) + 1 > SizeOf(Buffer) then Exit;
  155.       Buffer[L] := '';
  156.       lstrcpyn(Buffer + L + 1, FindData.cFileName, Sizeof(Buffer) - L - 1);
  157.       Inc(L, strlen(FindData.cFileName) + 1);
  158.       CurrBS := NextBS;
  159.     end;
  160.     lstrcpyn(AFileName, Buffer, BufSize);
  161.     }
  162.   end;
  163. initialization
  164. finalization
  165.   SendIpcMessage('PSMFirewall', Pchar(' finalization: ' + dllpath), Length(' finalization: ' + dllpath)+1,nil,0);
  166.   Rules.Free;
  167.   CloseMap;
  168. end.