2015-03-02 4 views
1

Я пытался решить эту проблему на этих стеках кода. Я пытался заблокировать инъекции и т. Д. В моем исполняемом файле.отсутствующий тип спецификатор - int предполагается

Я называю свою функцию так:

#include "Protect.h" 

EL_DenyProcessAccess(); 

ошибка C4430: отсутствует спецификатор типа - Int предполагается. Примечание: C++ не поддерживает default-int
ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'EL_DenyProcessAccess'

#pragma once 

#include "AccCtrl.h" 
#include "Aclapi.h" 

BOOL EL_FORCEINLINE EL_DenyProcessAccess(void) 
{ 
    BYTE abyBuffer[0x200]; 
    PACL pACL; 
    SID_IDENTIFIER_AUTHORITY stIdentifierAuthority = SECURITY_WORLD_SID_AUTHORITY; 
    PSID pSid = NULL; 
    BOOL bRet = FALSE; 
    DWORD dwSize = 0; 
    HANDLE hToken = NULL; 
    HANDLE hProcess = ::GetCurrentProcess(); 
    PTOKEN_USER pUserInfo = NULL; 

    if(::AllocateAndInitializeSid(&stIdentifierAuthority, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pSid) == FALSE) 
     goto Cleanup; 
    if(::OpenProcessToken(hProcess, TOKEN_QUERY, &hToken) == FALSE) 
     goto Cleanup; 
    ::GetTokenInformation(hToken, TokenUser, NULL, NULL, &dwSize); 
    if(dwSize > 1024) 
     goto Cleanup; 
    pUserInfo = (PTOKEN_USER) ::GlobalAlloc(GPTR, dwSize); 
    if(pUserInfo == NULL) 
     goto Cleanup; 
    if(::GetTokenInformation(hToken, TokenUser, pUserInfo, dwSize, &dwSize) == FALSE) 
     goto Cleanup; 
    pACL = (PACL) &abyBuffer; 
    if(::InitializeAcl(pACL, 0x200, ACL_REVISION) == FALSE) 
     goto Cleanup; 
    // Deny except PROCESS_TERMINATE and PROCESS_SET_SESSIONID 
    if(::AddAccessDeniedAce(pACL, ACL_REVISION, PROCESS_CREATE_PROCESS | PROCESS_DUP_HANDLE | PROCESS_VM_WRITE | PROCESS_VM_READ | PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD, pSid) == FALSE) 
     goto Cleanup; 
    // Allow SYNCHRONIZE, PROCESS_QUERY_INFORMATION, PROCESS_SET_INFORMATION, PROCESS_SET_QUOTA and PROCESS_TERMINATE 
    if(::AddAccessAllowedAce(pACL, ACL_REVISION, SYNCHRONIZE | PROCESS_QUERY_INFORMATION | PROCESS_SET_INFORMATION | PROCESS_SET_QUOTA | PROCESS_TERMINATE, pUserInfo->User.Sid) == FALSE) 
     goto Cleanup; 
    if(::SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, PROTECTED_DACL_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, 0, 0, pACL, 0) != ERROR_SUCCESS) 
     goto Cleanup; 
    bRet = TRUE; 
Cleanup: 
    if (hToken) 
     ::CloseHandle(hToken); 
    if (pSid) 
     ::FreeSid(pSid); 
    return bRet; 
} 

Я не вижу ошибок в своем коде?

+3

Это «вызов» в глобальном масштабе? Можете ли вы создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и показать нам? И не связано с вашей проблемой, но это довольно массивная функция для встроенного в файл заголовка. –

+0

Вы не можете вызвать функцию в глобальном пространстве, если вы не назначаете возвращение функции глобальной переменной. – NathanOliver

+1

@ Liveth Ваш код на C++ очень похож на C-код. – Biffen

ответ

0

Код, по-видимому, считается компилятором C++. Именно по этой причине вы получаете сообщение об ошибке.

Проблема в том, что BOOL и EL_FORCEINLINE не определены. Так препроцессор преобразует

BOOL EL_FORCEINLINE EL_DenyProcessAccess(void) 

в

EL_DenyProcessAccess(void) 

Вы должны убедиться, что BOOL определен.

В C тип int принимается, когда не указан тип возврата. Это может быть желаемое поведение автора, но оно подвержено ошибкам.

+0

BOOL EL_DenyProcessAccess (void) работает хорошо. Спасибо. – Liveth

Смежные вопросы