Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

142 lines
3.5 KiB

/******************************************************************************
Copyright (c) 1993-1998 Microsoft Corporation
Title: csrthrd.c - code to create a thread inside the server process
*****************************************************************************/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <ntcsrsrv.h>
#include <windows.h>
typedef PVOID (NTAPI *ADD_SERVER_THREAD)(HANDLE, PCLIENT_ID, ULONG);
/*
** Create a server thread
*/
BOOLEAN CreateServerPlayingThread(PVOID ThreadStartRoutine)
{
CLIENT_ID ClientId;
HANDLE hThread;
hThread = NULL;
RtlCreateUserThread(NtCurrentProcess(),
NULL,
(BOOLEAN)TRUE,
0,
0,
0,
(PUSER_THREAD_START_ROUTINE)ThreadStartRoutine,
NULL,
&hThread,
&ClientId);
if (!hThread) {
#if DBG
OutputDebugStringA("WINMM: Server failed to create user thread\n");
#endif
return FALSE;
} else {
HMODULE hModCSR;
ADD_SERVER_THREAD pCsrAddStaticServerThread;
hModCSR = GetModuleHandleW((LPCWSTR)L"csrsrv.dll");
#if DBG
if (hModCSR == NULL) {
OutputDebugStringA("WINMM: Could not get CSRSRV.DLL handle\n");
DebugBreak();
}
#endif
pCsrAddStaticServerThread =
(ADD_SERVER_THREAD)GetProcAddress(hModCSR, "CsrAddStaticServerThread");
if (pCsrAddStaticServerThread == NULL) {
#if DBG
OutputDebugStringA("WINMM: Could not get address if CsrAddStaticServerThread\n");
DebugBreak();
#endif
return FALSE;
}
(*pCsrAddStaticServerThread)(hThread, &ClientId, 0);
/*
* Resume the sound thread now that we've initialising things.
*/
NtResumeThread(hThread, NULL);
//NtClose(hThread);
return TRUE;
}
}
HANDLE CreatePnpNotifyThread(PVOID ThreadStartRoutine)
{
CLIENT_ID ClientId;
HANDLE hThread;
hThread = NULL;
RtlCreateUserThread(NtCurrentProcess(),
NULL,
(BOOLEAN)TRUE,
0,
0,
0,
(PUSER_THREAD_START_ROUTINE)ThreadStartRoutine,
NULL,
&hThread,
&ClientId);
if (NULL == hThread)
{
#if DBG
OutputDebugStringA("WINMM: Server failed to create PnpNotify thread\n");
#endif
return FALSE;
} else {
HMODULE hModCSR;
ADD_SERVER_THREAD pCsrAddStaticServerThread;
hModCSR = GetModuleHandleW((LPCWSTR)L"csrsrv.dll");
#if DBG
if (NULL == hModCSR)
{
OutputDebugStringA("WINMM: Could not get CSRSRV.DLL handle");
DebugBreak();
}
#endif
pCsrAddStaticServerThread =
(ADD_SERVER_THREAD)GetProcAddress(hModCSR, "CsrAddStaticServerThread");
if (pCsrAddStaticServerThread == NULL) {
#if DBG
OutputDebugStringA("WINMM: Could not get address if CsrAddStaticServerThread\n");
DebugBreak();
#endif
return FALSE;
}
(*pCsrAddStaticServerThread)(hThread, &ClientId, 0);
/*
* Resume the sound thread now that we've initialising things.
*/
NtResumeThread(hThread, NULL);
//NtClose(hThread);
return hThread;
}
}