Передача handle файла между процессами
От: Aniskin  
Дата: 17.08.17 19:00
Оценка:
Задумал я научить свою программку работать с файлами с временным повышением привилегий. Создал inproc com сервер, который запускается через CoGetObject('Elevation:Administrator!new:{мой GUID}'), с ним проблем нет, виндовое окно с запросом привилегий появляется, запускается DllHost.exe с повышенными привилегиями, внутри которого работает мой inproc com сервер. Внутри сервера вызываю CreateFileW, и полученный handle хочу передать в свою программу. Делается, это вроде как через DublicateHandle. Функция в сервере имеет примерно следующий вид:

function CreateFile(ACallerProcess: THandle; const AFileName: WideString; out AFileHandle: THandle): HResult; stdcall;
var
  Handle: THandle;
begin
  try
    Handle := CreateFileW(PWideChar(AFileName), GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    DuplicateHandle(GetCurrentProcessId, Handle, ACallerProcessID, @AFileHandle, 0, False, DUPLICATE_SAME_ACCESS);
    {if AFileHandle = 0 then
      MessageBox(0, PChar(IntToStr(GetLastError)), 'Error', MB_ICONHAND);}
    CloseHandle(Handle);
    Result := S_OK;
  except
    Result := E_FAIL;
  end;
end;


В качестве ACallerProcess передаю такое:

DuplicateHandle(GetCurrentProcess, GetCurrentProcess, GetCurrentProcess, @CallerProcess, 0, False, DUPLICATE_SAME_ACCESS);
или
CallerProcess := OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessId);


Но в любом случает при вызове в сервере DuplicateHandle имею ошибку ERROR_INVALID_HANDLE.

Куда копать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.