• Stan (03.04.08 19:39) [0]
    Как узнать что файл на данный момент проецируется в память (mapped) какой то программой. Интересует сам факт(да или нет), имя программы и остальное не нужно.
    К примеру шрифты в папке Fonts, файл Arial.ttf - всегда мэпирован.
  • Игорь Шевченко © (03.04.08 20:32) [1]

    > Как узнать что файл на данный момент проецируется в память
    > (mapped) какой то программой


    http://code.progler.ru/get/191 - может найдешь что полезное
  • Loginov Dmitry © (03.04.08 22:16) [2]
    > Как узнать что файл на данный момент проецируется в память
    > (mapped) какой то программой. Интересует сам факт(да или
    > нет), имя программы и остальное не нужно.


    Уменьши ему размер с помощью SetEndOfFile - узнаешь... ;)
  • Игорь Шевченко © (03.04.08 23:22) [3]
    Пример из [1] надо слегка дополнить

    procedure TfMain.PaintBoxSelectedMouseDown(Sender: TObject;
     Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
     EntryIndex, EntryX, EntryY : Integer;
     GridHeight:  Integer;
     GridWidth :  Integer;
     PaintBox : TPaintBox;
     Address: DWORD;
    begin
     PaintBox := Sender as TPaintBox;
     if Button = mbLeft then begin
       GridHeight := PaintBox.Height div 32;
       GridWidth  := PaintBox.Width  div 32;
       EntryX := (X div GridWidth);
       EntryY := (Y div GridHeight);
       EntryIndex := EntryY * 32 + EntryX;
       Address := DWORD(DWORD(EntryIndex) * FSelectedMemory.EntrySize) +
         FSelectedMemory.StartAddress;
       lbSelectedPage.Caption := Format('%.8x', [Address]);
       if FSelectedMemory.Map[EntryIndex] = MemImage then
         lbContents.Caption := GetModuleFileNameForAddress(Address)
       else if FSelectedMemory.Map[EntryIndex] = MemMapped then
         lbContents.Caption := GetMappedFileNameForAddress(Address)    
     else
         lbContents.Caption := 'Unknown';
     end;
    end;



    function TfMain.GetMappedFileNameForAddress(Address: DWORD): string;
    var
     ModuleName: array[0..1024] of char;
     rc: DWORD;
     mbi : TMemoryBasicInformation;
    begin
     rc := VirtualQueryEx(FCurrentProcess, Pointer(Address), mbi, SizeOf(mbi));
     if rc <> SizeOf(mbi) then
       raise Exception.Create(SysErrorMessage(GetLastError));
     rc := GetMappedFileName(FCurrentProcess, Pointer(mbi.AllocationBase),
         ModuleName, SizeOf(ModuleName));
     if rc > 0 then
       Result := ModuleName
     else
       Result := SysErrorMessage(GetLastError);
    end;

  • Stan (04.04.08 00:47) [4]
    >>Уменьши ему размер с помощью SetEndOfFile - узнаешь

    Собственно лекарство против этого и нужно. SetEndOfFile - вперед можно, назад нет. Вкратце - использую для затирания "хвостов" файлов.
  • Loginov Dmitry © (05.04.08 16:11) [5]
    > Собственно лекарство против этого и нужно. SetEndOfFile
    > - вперед можно, назад нет


    GetLastError не спасет? ;)
Есть новые Нет новых   [134433   +21][b:0][p:0.001]