206 lines
6.3 KiB
C++
206 lines
6.3 KiB
C++
|
#include "ids.h"
|
||
|
#include "cmmn.h"
|
||
|
|
||
|
#include <tchar.h>
|
||
|
#include <io.h>
|
||
|
#include <objbase.h>
|
||
|
|
||
|
#ifndef UNICODE
|
||
|
#error This has to be UNICODE
|
||
|
#endif
|
||
|
|
||
|
#define ARRAYSIZE(a) (sizeof((a))/sizeof((a)[0]))
|
||
|
|
||
|
static SECURITY_ATTRIBUTES _sa = {0};
|
||
|
static ACL* _pacl = NULL;
|
||
|
static SID* _psidLocalUsers = NULL;
|
||
|
static SECURITY_DESCRIPTOR* _psd = NULL;
|
||
|
|
||
|
HRESULT _InitSecurityDescriptor();
|
||
|
|
||
|
VOID InstanceThread(LPVOID lpvParam)
|
||
|
{
|
||
|
BYTE bRequest[4096];
|
||
|
DWORD cbBytesRead;
|
||
|
BOOL fSuccess;
|
||
|
HANDLE hPipe = (HANDLE)lpvParam;
|
||
|
|
||
|
fSuccess = ReadFile(hPipe, bRequest, sizeof(bRequest), &cbBytesRead,
|
||
|
NULL);
|
||
|
|
||
|
if (fSuccess && cbBytesRead)
|
||
|
{
|
||
|
if (!g_fPaused)
|
||
|
{
|
||
|
SendMessage(GetDlgItem(g_hwndDlg, IDC_EDIT1), EM_SETSEL, (WPARAM)-2,
|
||
|
(WPARAM)-2);
|
||
|
|
||
|
SendMessage(GetDlgItem(g_hwndDlg, IDC_EDIT1), EM_REPLACESEL, 0,
|
||
|
(LPARAM)(LPWSTR)bRequest);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DisconnectNamedPipe(hPipe);
|
||
|
CloseHandle(hPipe);
|
||
|
}
|
||
|
|
||
|
DWORD WINAPI Do(PVOID )
|
||
|
{
|
||
|
TCHAR szPipeName[MAX_PATH] = TEXT("\\\\.\\pipe\\ShellService_Diagnostic");
|
||
|
|
||
|
HRESULT hres = _InitSecurityDescriptor();
|
||
|
|
||
|
if (SUCCEEDED(hres))
|
||
|
{
|
||
|
g_hEvent = CreateEvent(NULL, TRUE, TRUE, TEXT("ShellService_Diagnostic"));
|
||
|
|
||
|
if (g_hEvent)
|
||
|
{
|
||
|
// The main loop creates an instance of the named pipe and
|
||
|
// then waits for a client to connect to it. When the client
|
||
|
// connects, a thread is created to handle communications
|
||
|
// with that client, and the loop is repeated.
|
||
|
do
|
||
|
{
|
||
|
HANDLE hPipe = CreateNamedPipe(
|
||
|
szPipeName, // pipe name
|
||
|
PIPE_ACCESS_DUPLEX, // read/write access
|
||
|
PIPE_TYPE_MESSAGE | // message type pipe
|
||
|
PIPE_READMODE_MESSAGE | // message-read mode
|
||
|
PIPE_WAIT, // blocking mode
|
||
|
PIPE_UNLIMITED_INSTANCES, // max. instances
|
||
|
256, // output buffer size
|
||
|
4096, // input buffer size
|
||
|
10 * 1000, // client time-out
|
||
|
&_sa);
|
||
|
|
||
|
if (hPipe != INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
// Wait for the client to connect; if it succeeds,
|
||
|
// the function returns a nonzero value. If the function returns
|
||
|
// zero, GetLastError returns ERROR_PIPE_CONNECTED.
|
||
|
|
||
|
BOOL fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE :
|
||
|
(GetLastError() == ERROR_PIPE_CONNECTED);
|
||
|
|
||
|
if (fConnected)
|
||
|
{
|
||
|
DWORD dwThreadId;
|
||
|
|
||
|
// Create a thread for this client.
|
||
|
HANDLE hThread = CreateThread(
|
||
|
NULL, // no security attribute
|
||
|
0, // default stack size
|
||
|
(LPTHREAD_START_ROUTINE) InstanceThread,
|
||
|
(LPVOID) hPipe, // thread parameter
|
||
|
0, // not suspended
|
||
|
&dwThreadId); // returns thread ID
|
||
|
|
||
|
if (hThread)
|
||
|
{
|
||
|
CloseHandle(hThread);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// The client could not connect, so close the pipe.
|
||
|
CloseHandle(hPipe);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#pragma warning(push)
|
||
|
#pragma warning(disable : 4127)
|
||
|
while (1);
|
||
|
#pragma warning(pop)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
HRESULT _InitSecurityDescriptor()
|
||
|
{
|
||
|
HRESULT hres;
|
||
|
|
||
|
if (_pacl)
|
||
|
{
|
||
|
hres = S_OK;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hres = E_FAIL;
|
||
|
SID_IDENTIFIER_AUTHORITY sidAuthNT = SECURITY_WORLD_SID_AUTHORITY;
|
||
|
|
||
|
if (AllocateAndInitializeSid(&sidAuthNT, 1, SECURITY_WORLD_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;
|
||
|
}
|