mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
5.5 KiB
207 lines
5.5 KiB
#include "shsrvice.h"
|
|
|
|
#include "dbg.h"
|
|
#include "tfids.h"
|
|
|
|
#pragma warning(push)
|
|
// FALSE positive below: gss
|
|
#pragma warning(disable : 4101)
|
|
|
|
// for now
|
|
static SECURITY_ATTRIBUTES _sa = {0};
|
|
static ACL* _pacl = NULL;
|
|
static SID* _psidLocalUsers = NULL;
|
|
static SECURITY_DESCRIPTOR* _psd = NULL;
|
|
|
|
HRESULT _InitSecurityDescriptor();
|
|
// for now
|
|
|
|
#ifdef UNICODE
|
|
extern "C"
|
|
{
|
|
int __cdecl wmain(int argc, wchar_t* argv[])
|
|
#else
|
|
int __cdecl main(int argc, char* argv[])
|
|
#endif
|
|
{
|
|
TRACE(TF_SERVICE, TEXT("Entered main"));
|
|
|
|
HRESULT hres = E_INVALIDARG;
|
|
|
|
#ifdef DEBUG
|
|
CGenericServiceManager::_fRunAsService = FALSE;
|
|
#endif
|
|
|
|
if (argc > 1)
|
|
{
|
|
hres = CGenericServiceManager::Init();
|
|
|
|
if (!lstrcmpi(argv[1], TEXT("-i")) ||
|
|
!lstrcmpi(argv[1], TEXT("/i")))
|
|
{
|
|
TRACE(TF_SERVICE, TEXT("Installing"));
|
|
hres = CGenericServiceManager::Install();
|
|
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
TRACE(TF_SERVICE, TEXT("Install SUCCEEDED"));
|
|
}
|
|
else
|
|
{
|
|
TRACE(TF_SERVICE, TEXT("Install FAILED"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!lstrcmpi(argv[1], TEXT("-u")) ||
|
|
!lstrcmpi(argv[1], TEXT("/u")))
|
|
{
|
|
TRACE(TF_SERVICE, TEXT("UnInstalling"));
|
|
hres = CGenericServiceManager::UnInstall();
|
|
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
TRACE(TF_SERVICE, TEXT("UnInstall SUCCEEDED"));
|
|
}
|
|
else
|
|
{
|
|
TRACE(TF_SERVICE, TEXT("UnInstall FAILED"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hres = E_INVALIDARG;
|
|
}
|
|
}
|
|
|
|
CGenericServiceManager::Cleanup();
|
|
}
|
|
else
|
|
{
|
|
hres = CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
|
|
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
// hres = _InitSecurityDescriptor();
|
|
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
hres = CoInitializeSecurity(_psd, -1, NULL, NULL,
|
|
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL,
|
|
EOAC_NONE, NULL);
|
|
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
// need to be here at most 2 seconds after being launched
|
|
hres = CGenericServiceManager::StartServiceCtrlDispatcher();
|
|
}
|
|
else
|
|
{
|
|
TRACE(TF_SERVICE, TEXT("CoInitializeSecurity failed: 0x%08X"), hres);
|
|
}
|
|
}
|
|
|
|
CoUninitialize();
|
|
}
|
|
}
|
|
|
|
return hres;
|
|
}
|
|
#ifdef UNICODE
|
|
}
|
|
#endif
|
|
#pragma warning(pop)
|
|
|
|
HRESULT _InitSecurityDescriptor()
|
|
{
|
|
HRESULT hres;
|
|
|
|
if (_pacl)
|
|
{
|
|
hres = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hres = E_FAIL;
|
|
// This is for "Everyone":
|
|
//
|
|
// SID_IDENTIFIER_AUTHORITY sidAuthNT = SECURITY_WORLD_SID_AUTHORITY;
|
|
//
|
|
// if (AllocateAndInitializeSid(&sidAuthNT, 1, SECURITY_WORLD_RID,
|
|
// 0, 0, 0, 0, 0, 0, 0, (void**)&_psidLocalUsers))
|
|
|
|
// This is for local entities only
|
|
SID_IDENTIFIER_AUTHORITY sidAuthNT = SECURITY_NT_AUTHORITY;
|
|
|
|
if (AllocateAndInitializeSid(&sidAuthNT, 1, SECURITY_INTERACTIVE_RID,
|
|
0, 0, 0, 0, 0, 0, 0, (void**)&_psidLocalUsers))
|
|
{
|
|
DWORD cbacl = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) -
|
|
sizeof(DWORD/*ACCESS_ALLOWED_ACE.SidStart*/) +
|
|
GetLengthSid(_psidLocalUsers);
|
|
|
|
_pacl = (ACL*)LocalAlloc(LPTR, cbacl);
|
|
|
|
if (_pacl)
|
|
{
|
|
if (InitializeAcl(_pacl, cbacl, ACL_REVISION))
|
|
{
|
|
if (AddAccessAllowedAce(_pacl, ACL_REVISION, FILE_ALL_ACCESS,
|
|
_psidLocalUsers))
|
|
{
|
|
_psd = (SECURITY_DESCRIPTOR*)LocalAlloc(LPTR,
|
|
sizeof(SECURITY_DESCRIPTOR));
|
|
|
|
if (_psd)
|
|
{
|
|
if (InitializeSecurityDescriptor(_psd,
|
|
SECURITY_DESCRIPTOR_REVISION))
|
|
{
|
|
if (SetSecurityDescriptorDacl(_psd, TRUE,
|
|
_pacl, FALSE))
|
|
{
|
|
if (IsValidSecurityDescriptor(_psd))
|
|
{
|
|
_sa.nLength = sizeof(_sa);
|
|
_sa.lpSecurityDescriptor = _psd;
|
|
_sa.bInheritHandle = TRUE;
|
|
|
|
hres = S_OK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hres = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hres = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (FAILED(hres))
|
|
{
|
|
if (_psidLocalUsers)
|
|
{
|
|
FreeSid(_psidLocalUsers);
|
|
}
|
|
|
|
if (_pacl)
|
|
{
|
|
LocalFree((HLOCAL)_pacl);
|
|
}
|
|
|
|
if (_psd)
|
|
{
|
|
LocalFree((HLOCAL)_psd);
|
|
}
|
|
}
|
|
}
|
|
|
|
return hres;
|
|
}
|