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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2012, 19:02   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Таких методов нет. Однако если хочешь защититься от назойливого пользователя, можно попробовать настроить политику безопасности, запретив ему вход в каталог с записываемым файлом, однако дать доступ к этому файлу на запись (программа напрямую будет к файлу обращаться и писать, а пользователь хоть и имеет возможность в него писать но не зайдет в него).
Я же сказал - нужно знать механизм твоей программы чтоб точно сказать что проще.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.04.2012, 21:44   #12
Maincore
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 51
По умолчанию

Да а как тогда можно определить с какими файлами программа работает в данный момент.

Stilet,а почему вы против хуков?

Последний раз редактировалось Maincore; 08.04.2012 в 22:03.
Maincore вне форума Ответить с цитированием
Старый 08.04.2012, 22:39   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как тогда можно определить с какими файлами программа работает в данный момент.
Дай бог памяти... Кажись через PsAPI можно получить хендлы открытых файлов. Я давно этим не занимался, навскидку так не помню уже.

Вот из своей коллекции что выдернуть могу:

Код:
  function GetHandlesFileFromPID(PID:cardinal=MAXDWORD):string;
var SystemInformation: PSYSTEM_PROCESS_INFORMATION;
  pHandleInfo: PSYSTEM_HANDLE_INFORMATION_EX;
b:byte;  i:integer;    s:String;
cp,hp:Cardinal;hFile: THandle;
begin
 b:=GetFileHandleType;
SystemInformation:= GetInfoTable(5);
  if SystemInformation <> nil then
    pHandleInfo := GetInfoTable(16);
for I := 0 to pHandleInfo^.NumberOfHandles - 1 do
      begin
        if pHandleInfo^.Information[I].ObjectTypeNumber = b then
        begin
          hP := OpenProcess(PROCESS_DUP_HANDLE, True,
            pHandleInfo^.Information[I].ProcessId);
          if hP > 0 then
          try
            if DuplicateHandle(hP, pHandleInfo^.Information[I].Handle,
              GetCurrentProcess, @hFile, 0, False, DUPLICATE_SAME_ACCESS) then
            try
              if Application.Terminated then Exit;
              s := GetFileNameFromHandle(hFile);
//              caption:=IntToStr(cp);
             if (trim(s)<>'')and(pHandleInfo^.Information[I].ProcessId=PID)or(PID=MAXDWORD) then
               result:=result+({inttostr(pHandleInfo^.Information[I].ProcessId)+' '+}s)
               +#10#13;
            finally
              CloseHandle(hFile);
            end;
          finally
            CloseHandle(hP);
          end;
        end;
        Application.ProcessMessages;
      end;
end;
И к ней
Код:
  function GetInfoTable(ATableType: DWORD): Pointer;
   const STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004);
   var
     dwSize: DWORD;
     pPtr: Pointer;
     ntStatus: NT_STATUS;
   begin
     Result := nil;
     dwSize := WORD(-1);
     GetMem(pPtr, dwSize);
     ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);
     while ntStatus = STATUS_INFO_LENGTH_MISMATCH do
     begin
       dwSize := dwSize * 2;
       ReallocMem(pPtr, dwSize);
       ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);
     end;
     if ntStatus = NT_STATUS($00000000){STATUS_SUCCESS} then
       Result := pPtr
     else
       FreeMem(pPtr);
   end;
Код:
function GetFileNameFromHandle(hFile: THandle): String;
  var
    lpExitCode: DWORD;
    pThreadParam: TGetFileNameThreadParam;
    hThread: THandle;
  begin
    Result := '';
    ZeroMemory(@pThreadParam, SizeOf(TGetFileNameThreadParam));
    pThreadParam.hFile := hFile;
    hThread := CreateThread(nil, 0, @GetFileNameThread, @pThreadParam, 0, PDWORD(nil)^);
    if hThread <> 0 then
    try
      case WaitForSingleObject(hThread, 100) of
        WAIT_OBJECT_0:
        begin
          GetExitCodeThread(hThread, lpExitCode);
          if lpExitCode = NT_STATUS($00000000){STATUS_SUCCESS} then
            Result := pThreadParam.Data;
        end;
        WAIT_TIMEOUT:
          TerminateThread(hThread, 0);
      end;
    finally
      CloseHandle(hThread);
    end;
  end;
Цитата:
а почему вы против хуков?
Я ж сказал - дырка это в системе безопасности.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
API TotKtoNado Win Api 8 05.08.2011 07:06
Cи++ API Taracan Фриланс 24 24.07.2011 15:36
Перехват GL Api coNsept Общие вопросы C/C++ 6 19.06.2011 02:42
VK API Furyon JavaScript, Ajax 0 15.05.2011 17:44
Win32 Api! alexov Общие вопросы C/C++ 7 09.02.2009 22:25