VirtualProtectEx, вызванный из службы, возвращает false, но GetLastError равен 0 (успех) - PullRequest
0 голосов
/ 20 января 2019

Почему функция VirtualProtectEx не работает при вызове из приложения-службы?уже выполняется из простого приложения, все работает нормально.

Тогда есть возможность заставить эту функцию работать также из службы?

Вот мой код:

void WriteProcMem(HANDLE hProcess, VOID *pAddr)
{
    DWORD oldProtection;
    DWORD bytesWritten = 0;
    BYTE data[] = { 0x90, 0x90, 0x90, 0x90, 0x90 }; // Only a example of assembly data

    if (!VirtualProtectEx(hProcess, (LPVOID)pAddr, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &oldProtection)) {
        printf("\n VirtualProtectEx() error - %d\n", GetLastError());

        //=============== To debug from service application ===================

        FILE * pFile;
        pFile = fopen("C:\\myfile.txt", "w");
        if (pFile != NULL)
        {

            char * str = new char[100];
            sprintf(str, "%d", GetLastError());

            fputs(str, pFile);
            fclose(pFile);
        }

        //======================================================================

        return;
    }

    if (WriteProcessMemory(hProcess, (LPVOID)pAddr, &data, sizeof(data), &bytesWritten)) {

        printf("\n Data written success! \n");

        if (!VirtualProtectEx(hProcess, (LPVOID)pAddr, sizeof(DWORD), oldProtection, &oldProtection))
            printf("\n VirtualProtectEx() [2] error - %d \n", GetLastError());
    }

}

Служба выполняет дочерний процесс в режиме отладки, и с учетной записью SYSTEM эти данные должны быть записаны в " child.exe ".


ИЗДАНИЕ:

После ответа @SM реальное значение, возвращаемое GetLastError(), равно:

ERROR_INVALID_HANDLE : 6 (0x6) - дескриптор недействителен.

Но, как я уже сказал, когда не выполняется как служба, все работает нормально.Почему это происходит?

1 Ответ

0 голосов
/ 20 января 2019

Это ответ на ваш заголовок.

Строка pFile = fopen("C:\\myfile.txt", "w"); вызывает функции API Windows и, возможно, сбрасывает последний код ошибки. Таким образом, правильное обращение с последним кодом ошибки сохраняет его в переменную сразу после интересного вызова API. Попробуйте приведенный ниже код, и вы должны получить реальный код ошибки после вызова VirtualProtectEx.

if (!VirtualProtectEx(hProcess, (LPVOID)pAddr, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &oldProtection)) {
    int err_code = GetLastError();
    printf("\n VirtualProtectEx() error - %d\n", err_code):

    //=============== To debug from service application ===================

    FILE * pFile = fopen("C:\\myfile.txt", "w");
    if (pFile != NULL)
    {
        fprintf(pFile, "%d\n", err_code);
        fclose(pFile);
    }
    ...
...