Как получить доступ к дескрипторам объекта родителя? - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть ParentProcess.exe, который имеет следующий код. Он создает файл и заполняет его простым символом 1, затем создает новый процесс, который называется ChildProcess.exe. Этот ChildProcess создан с флагом bIheritance true. Я хотел, чтобы у него была возможность получить доступ к объектам родителя.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int main(int argc, const char* argv[])
{
    SECURITY_ATTRIBUTES process_sa;
    process_sa.nLength = sizeof(process_sa);
    process_sa.bInheritHandle = TRUE;
    process_sa.lpSecurityDescriptor = 0;

    SECURITY_ATTRIBUTES thread_sa;
    thread_sa.nLength = sizeof(thread_sa);
    thread_sa.bInheritHandle = TRUE;
    thread_sa.lpSecurityDescriptor = NULL;

    HANDLE hFileCreated = CreateFile("e:\\Sample.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, &process_sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if (hFileCreated == INVALID_HANDLE_VALUE)
    {
        printf("File doesn't created.");
        return 1;
    }

    char c = '1';
    DWORD w;
    WriteFile(hFileCreated, &c, 1, &w, 0);

    STARTUPINFO sinfo;
    ZeroMemory(&sinfo, sizeof(sinfo));
    sinfo.cb = sizeof(sinfo);

    PROCESS_INFORMATION pinfo;
    ZeroMemory(&pinfo, sizeof(pinfo));

    if (CreateProcess(0, "ChildProcess.exe", &process_sa, &thread_sa, TRUE, 0, 0, 0, &sinfo, &pinfo))
        printf("done.");
    else
        printf("failed.");

    CloseHandle(pinfo.hThread);
    CloseHandle(pinfo.hProcess);


    return 0;
}

ChildProcess.exe имел следующий код, который я хотел, чтобы он мог получить доступ к дескриптору файла, который создан родительским процессом, но когда он запускается, он показывает адрес 0XFFFFFFFF. В чем проблема. Код ChildProcess:

#include <Windows.h>
#include <process.h>
#include <stdio.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{

    HANDLE hFileCreatedInheritance = INVALID_HANDLE_VALUE;
    _stscanf_s(L"e:\\Sample.txt", _T("%p"), &hFileCreatedInheritance);
    printf("The handle of the file is %p.\n", hFileCreatedInheritance);


    return 0;
}

1 Ответ

1 голос
/ 04 апреля 2020

В родительском процессе:

Преобразовать ваш дескриптор в строку перед вставкой в ​​текстовый файл:

DWORD w;
std::stringstream streamAdr;
streamAdr << hFileCreated;  
std::string strAddr = streamAdr.str(); 

WriteFile(hFileCreated, strAddr.c_str(), strAddr.size(), &w, 0);  

В дочернем процессе:

string sLine;
ifstream infile("G:\\Sample.txt");
if (infile.good())
{
    getline(infile, sLine); // Get first line containing handle of file
    infile.close(); 

    unsigned int i = stoi(sLine.c_str(), 0, 16); // Convert hexadecimal string

    hFileCreatedInheritance = (HANDLE) i; // cast to a HANDLE
    printf("The handle of the file is %p.\n", hFileCreatedInheritance);
}

Результат:

enter image description here

Вопрос:
Чего вы пытаетесь достичь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...