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.
374 lines
9.4 KiB
374 lines
9.4 KiB
/*==========================================================================
|
|
*
|
|
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: killsvr.c
|
|
* Content: kill dplay.exe
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 06-apr-95 craige initial implementation
|
|
* 24-jun-95 craige kill all attached processes
|
|
* 2-feb-97 andyco ported for dplaysvr.exe
|
|
* 7-jul-97 kipo added non-console support
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <conio.h>
|
|
#include "dplaysvr.h"
|
|
|
|
// only do printf's when built as a console app
|
|
|
|
#ifdef NOCONSOLE
|
|
#pragma warning(disable:4002)
|
|
#define printf()
|
|
#endif
|
|
|
|
|
|
//**********************************************************************
|
|
// Globals
|
|
//**********************************************************************
|
|
BOOL g_fDaclInited = FALSE;
|
|
SECURITY_ATTRIBUTES g_sa;
|
|
BYTE g_abSD[SECURITY_DESCRIPTOR_MIN_LENGTH];
|
|
PSECURITY_ATTRIBUTES g_psa = NULL;
|
|
PACL g_pEveryoneACL = NULL;
|
|
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// DNGetNullDacl - Get a SECURITY_ATTRIBUTE structure that specifies a
|
|
// NULL DACL which is accessible by all users.
|
|
// Taken from IDirectPlay8 code base.
|
|
//
|
|
// Entry: Nothing
|
|
//
|
|
// Exit: PSECURITY_ATTRIBUTES
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "DNGetNullDacl"
|
|
PSECURITY_ATTRIBUTES DNGetNullDacl()
|
|
{
|
|
PSID psidEveryone = NULL;
|
|
SID_IDENTIFIER_AUTHORITY siaWorld = SECURITY_WORLD_SID_AUTHORITY;
|
|
DWORD dwAclSize;
|
|
|
|
// This is done to make this function independent of DNOSIndirectionInit so that the debug
|
|
// layer can call it before the indirection layer is initialized.
|
|
if (!g_fDaclInited)
|
|
{
|
|
if (!InitializeSecurityDescriptor((SECURITY_DESCRIPTOR*)g_abSD, SECURITY_DESCRIPTOR_REVISION))
|
|
{
|
|
DPF(0, "Failed to initialize security descriptor" );
|
|
goto Error;
|
|
}
|
|
|
|
// Create SID for the Everyone group.
|
|
if (!AllocateAndInitializeSid(&siaWorld, 1, SECURITY_WORLD_RID, 0,
|
|
0, 0, 0, 0, 0, 0, &psidEveryone))
|
|
{
|
|
DPF(0, "Failed to allocate Everyone SID" );
|
|
goto Error;
|
|
}
|
|
|
|
dwAclSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(psidEveryone) - sizeof(DWORD);
|
|
|
|
// Allocate the ACL, this won't be a tracked allocation and we will let process cleanup destroy it
|
|
g_pEveryoneACL = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize);
|
|
if (g_pEveryoneACL == NULL)
|
|
{
|
|
DPF(0, "Failed to allocate ACL buffer" );
|
|
goto Error;
|
|
}
|
|
|
|
// Intialize the ACL.
|
|
if (!InitializeAcl(g_pEveryoneACL, dwAclSize, ACL_REVISION))
|
|
{
|
|
DPF(0, "Failed to initialize ACL" );
|
|
goto Error;
|
|
}
|
|
|
|
// Add the ACE.
|
|
if (!AddAccessAllowedAce(g_pEveryoneACL, ACL_REVISION, GENERIC_ALL, psidEveryone))
|
|
{
|
|
DPF(0, "Failed to add ACE to ACL" );
|
|
goto Error;
|
|
}
|
|
|
|
// We no longer need the SID that was allocated.
|
|
FreeSid(psidEveryone);
|
|
psidEveryone = NULL;
|
|
|
|
// Add the ACL to the security descriptor..
|
|
if (!SetSecurityDescriptorDacl((SECURITY_DESCRIPTOR*)g_abSD, TRUE, g_pEveryoneACL, FALSE))
|
|
{
|
|
DPF(0, "Failed to add ACL to security descriptor" );
|
|
goto Error;
|
|
}
|
|
|
|
g_sa.nLength = sizeof(SECURITY_ATTRIBUTES);
|
|
g_sa.lpSecurityDescriptor = g_abSD;
|
|
g_sa.bInheritHandle = FALSE;
|
|
|
|
g_psa = &g_sa;
|
|
|
|
g_fDaclInited = TRUE;
|
|
}
|
|
Error:
|
|
if (psidEveryone)
|
|
{
|
|
FreeSid(psidEveryone);
|
|
psidEveryone = NULL;
|
|
}
|
|
return g_psa;
|
|
}
|
|
//**********************************************************************
|
|
|
|
/*
|
|
* sendRequest
|
|
*
|
|
* communicate a request to DPHELP
|
|
*/
|
|
static BOOL sendRequest( LPDPHELPDATA req_phd )
|
|
{
|
|
OSVERSIONINFOA VersionInfo;
|
|
BOOL fUseGlobalNamespace;
|
|
LPDPHELPDATA phd;
|
|
HANDLE hmem;
|
|
HANDLE hmutex;
|
|
HANDLE hackevent;
|
|
HANDLE hstartevent;
|
|
BOOL rc;
|
|
|
|
|
|
// Determine if we're running on NT.
|
|
memset(&VersionInfo, 0, sizeof(VersionInfo));
|
|
VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo);
|
|
if (GetVersionExA(&VersionInfo))
|
|
{
|
|
if (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
|
{
|
|
/*
|
|
printf("Running on NT version %u.%u.%u, using global namespace.\n",
|
|
VersionInfo.dwMajorVersion, VersionInfo.dwMinorVersion, VersionInfo.dwBuildNumber);
|
|
*/
|
|
fUseGlobalNamespace = TRUE;
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
printf("Running on 9x version %u.%u.%u, not using global namespace.\n",
|
|
VersionInfo.dwMajorVersion, VersionInfo.dwMinorVersion, LOWORD(VersionInfo.dwBuildNumber));
|
|
*/
|
|
fUseGlobalNamespace = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//printf("Could not determine OS version, assuming global namespace not needed.\n");
|
|
fUseGlobalNamespace = FALSE;
|
|
}
|
|
|
|
|
|
/*
|
|
* get events start/ack events
|
|
*/
|
|
if (fUseGlobalNamespace)
|
|
{
|
|
hstartevent = CreateEvent( DNGetNullDacl(), FALSE, FALSE, "Global\\" DPHELP_EVENT_NAME );
|
|
}
|
|
else
|
|
{
|
|
hstartevent = CreateEvent( NULL, FALSE, FALSE, DPHELP_EVENT_NAME );
|
|
}
|
|
printf( "hstartevent = %08lx\n", hstartevent );
|
|
if( hstartevent == NULL )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (fUseGlobalNamespace)
|
|
{
|
|
hackevent = CreateEvent( DNGetNullDacl(), FALSE, FALSE, "Global\\" DPHELP_ACK_EVENT_NAME );
|
|
}
|
|
else
|
|
{
|
|
hackevent = CreateEvent( NULL, FALSE, FALSE, DPHELP_ACK_EVENT_NAME );
|
|
}
|
|
printf( "hackevent = %08lx\n", hackevent );
|
|
if( hackevent == NULL )
|
|
{
|
|
CloseHandle( hstartevent );
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
* create shared memory area
|
|
*/
|
|
if (fUseGlobalNamespace)
|
|
{
|
|
hmem = CreateFileMapping( INVALID_HANDLE_VALUE, DNGetNullDacl(),
|
|
PAGE_READWRITE, 0, sizeof( DPHELPDATA ),
|
|
"Global\\" DPHELP_SHARED_NAME );
|
|
}
|
|
else
|
|
{
|
|
hmem = CreateFileMapping( INVALID_HANDLE_VALUE, NULL,
|
|
PAGE_READWRITE, 0, sizeof( DPHELPDATA ),
|
|
DPHELP_SHARED_NAME );
|
|
}
|
|
printf( "hmem = %08lx\n", hmem );
|
|
if( hmem == NULL )
|
|
{
|
|
printf( "Could not create file mapping!\n" );
|
|
CloseHandle( hstartevent );
|
|
CloseHandle( hackevent );
|
|
return FALSE;
|
|
}
|
|
|
|
phd = (LPDPHELPDATA) MapViewOfFile( hmem, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
|
|
printf( "phd = %08lx\n", phd );
|
|
if( phd == NULL )
|
|
{
|
|
printf( "Could not create view of file!\n" );
|
|
CloseHandle( hmem );
|
|
CloseHandle( hstartevent );
|
|
CloseHandle( hackevent );
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
* wait for access to the shared memory
|
|
*/
|
|
if (fUseGlobalNamespace)
|
|
{
|
|
hmutex = OpenMutex( SYNCHRONIZE, FALSE, "Global\\" DPHELP_MUTEX_NAME );
|
|
}
|
|
else
|
|
{
|
|
hmutex = OpenMutex( SYNCHRONIZE, FALSE, DPHELP_MUTEX_NAME );
|
|
}
|
|
printf( "hmutex = %08lx\n", hmutex );
|
|
if( hmutex == NULL )
|
|
{
|
|
printf( "Could not create mutex!\n" );
|
|
UnmapViewOfFile( phd );
|
|
CloseHandle( hmem );
|
|
CloseHandle( hstartevent );
|
|
CloseHandle( hackevent );
|
|
return FALSE;
|
|
}
|
|
WaitForSingleObject( hmutex, INFINITE );
|
|
|
|
/*
|
|
* wake up DPHELP with our request
|
|
*/
|
|
memcpy( phd, req_phd, sizeof( DPHELPDATA ) );
|
|
printf( "waking up DPHELP\n" );
|
|
if( SetEvent( hstartevent ) )
|
|
{
|
|
printf( "Waiting for response\n" );
|
|
WaitForSingleObject( hackevent, INFINITE );
|
|
memcpy( req_phd, phd, sizeof( DPHELPDATA ) );
|
|
rc = TRUE;
|
|
printf( "got response\n" );
|
|
}
|
|
else
|
|
{
|
|
printf("Could not signal event to notify DPHELP!\n" );
|
|
rc = FALSE;
|
|
}
|
|
|
|
/*
|
|
* done with things
|
|
*/
|
|
ReleaseMutex( hmutex );
|
|
CloseHandle( hmutex );
|
|
CloseHandle( hstartevent );
|
|
CloseHandle( hackevent );
|
|
UnmapViewOfFile( phd );
|
|
CloseHandle( hmem );
|
|
return rc;
|
|
|
|
} /* sendRequest */
|
|
|
|
|
|
// if the main entry point is called "WinMain" we will be built
|
|
// as a windows app
|
|
#ifdef NOCONSOLE
|
|
|
|
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine, int nCmdShow)
|
|
|
|
#else
|
|
|
|
// if the main entry point is called "main" we will be built
|
|
// as a console app
|
|
|
|
int __cdecl main( int argc, char *argv[] )
|
|
|
|
#endif
|
|
{
|
|
OSVERSIONINFOA VersionInfo;
|
|
BOOL fUseGlobalNamespace;
|
|
HANDLE h;
|
|
DPHELPDATA hd;
|
|
|
|
|
|
// Determine if we're running on NT.
|
|
memset(&VersionInfo, 0, sizeof(VersionInfo));
|
|
VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo);
|
|
if (GetVersionExA(&VersionInfo))
|
|
{
|
|
if (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
|
{
|
|
printf("Running on NT version %u.%u.%u, using global namespace.\n",
|
|
VersionInfo.dwMajorVersion, VersionInfo.dwMinorVersion, VersionInfo.dwBuildNumber);
|
|
fUseGlobalNamespace = TRUE;
|
|
}
|
|
else
|
|
{
|
|
printf("Running on 9x version %u.%u.%u, not using global namespace.\n",
|
|
VersionInfo.dwMajorVersion, VersionInfo.dwMinorVersion, LOWORD(VersionInfo.dwBuildNumber));
|
|
fUseGlobalNamespace = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("Could not determine OS version, assuming global namespace not needed.\n");
|
|
fUseGlobalNamespace = FALSE;
|
|
}
|
|
|
|
if (fUseGlobalNamespace)
|
|
{
|
|
h = OpenEvent( SYNCHRONIZE, FALSE, "Global\\" DPHELP_STARTUP_EVENT_NAME );
|
|
}
|
|
else
|
|
{
|
|
h = OpenEvent( SYNCHRONIZE, FALSE, DPHELP_STARTUP_EVENT_NAME );
|
|
}
|
|
if( h == NULL )
|
|
{
|
|
printf( "Helper not running\n" );
|
|
return 0;
|
|
}
|
|
|
|
printf( "*** SUICIDE ***\n" );
|
|
hd.req = DPHELPREQ_SUICIDE;
|
|
sendRequest( &hd );
|
|
|
|
// This should be done after functions that use a Dacl will no longer be
|
|
// called (CreateMutex, CreateFile, etc).
|
|
if (g_pEveryoneACL)
|
|
{
|
|
HeapFree(GetProcessHeap(), 0, g_pEveryoneACL);
|
|
g_pEveryoneACL = NULL;
|
|
g_psa = NULL;
|
|
g_fDaclInited = FALSE;
|
|
}
|
|
|
|
return 0;
|
|
}
|