Blame winpr/include/winpr/thread.h

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Process Thread Functions
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifndef WINPR_THREAD_H
Packit 1fb8d4
#define WINPR_THREAD_H
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/winpr.h>
Packit 1fb8d4
#include <winpr/wtypes.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/spec.h>
Packit 1fb8d4
#include <winpr/handle.h>
Packit 1fb8d4
Packit 1fb8d4
#ifdef __cplusplus
Packit 1fb8d4
extern "C" {
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#ifndef _WIN32
Packit 1fb8d4
Packit 1fb8d4
typedef struct _STARTUPINFOA
Packit 1fb8d4
{
Packit 1fb8d4
	DWORD cb;
Packit 1fb8d4
	LPSTR lpReserved;
Packit 1fb8d4
	LPSTR lpDesktop;
Packit 1fb8d4
	LPSTR lpTitle;
Packit 1fb8d4
	DWORD dwX;
Packit 1fb8d4
	DWORD dwY;
Packit 1fb8d4
	DWORD dwXSize;
Packit 1fb8d4
	DWORD dwYSize;
Packit 1fb8d4
	DWORD dwXCountChars;
Packit 1fb8d4
	DWORD dwYCountChars;
Packit 1fb8d4
	DWORD dwFillAttribute;
Packit 1fb8d4
	DWORD dwFlags;
Packit 1fb8d4
	WORD wShowWindow;
Packit 1fb8d4
	WORD cbReserved2;
Packit 1fb8d4
	LPBYTE lpReserved2;
Packit 1fb8d4
	HANDLE hStdInput;
Packit 1fb8d4
	HANDLE hStdOutput;
Packit 1fb8d4
	HANDLE hStdError;
Packit 1fb8d4
} STARTUPINFOA, *LPSTARTUPINFOA;
Packit 1fb8d4
Packit 1fb8d4
typedef struct _STARTUPINFOW
Packit 1fb8d4
{
Packit 1fb8d4
	DWORD cb;
Packit 1fb8d4
	LPWSTR lpReserved;
Packit 1fb8d4
	LPWSTR lpDesktop;
Packit 1fb8d4
	LPWSTR lpTitle;
Packit 1fb8d4
	DWORD dwX;
Packit 1fb8d4
	DWORD dwY;
Packit 1fb8d4
	DWORD dwXSize;
Packit 1fb8d4
	DWORD dwYSize;
Packit 1fb8d4
	DWORD dwXCountChars;
Packit 1fb8d4
	DWORD dwYCountChars;
Packit 1fb8d4
	DWORD dwFillAttribute;
Packit 1fb8d4
	DWORD dwFlags;
Packit 1fb8d4
	WORD wShowWindow;
Packit 1fb8d4
	WORD cbReserved2;
Packit 1fb8d4
	LPBYTE lpReserved2;
Packit 1fb8d4
	HANDLE hStdInput;
Packit 1fb8d4
	HANDLE hStdOutput;
Packit 1fb8d4
	HANDLE hStdError;
Packit 1fb8d4
} STARTUPINFOW, *LPSTARTUPINFOW;
Packit 1fb8d4
Packit 1fb8d4
#ifdef UNICODE
Packit 1fb8d4
typedef STARTUPINFOW	STARTUPINFO;
Packit 1fb8d4
typedef LPSTARTUPINFOW	LPSTARTUPINFO;
Packit 1fb8d4
#else
Packit 1fb8d4
typedef STARTUPINFOA	STARTUPINFO;
Packit 1fb8d4
typedef LPSTARTUPINFOA	LPSTARTUPINFO;
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#define STARTF_USESHOWWINDOW        0x00000001
Packit 1fb8d4
#define STARTF_USESIZE              0x00000002
Packit 1fb8d4
#define STARTF_USEPOSITION          0x00000004
Packit 1fb8d4
#define STARTF_USECOUNTCHARS        0x00000008
Packit 1fb8d4
#define STARTF_USEFILLATTRIBUTE     0x00000010
Packit 1fb8d4
#define STARTF_RUNFULLSCREEN        0x00000020
Packit 1fb8d4
#define STARTF_FORCEONFEEDBACK      0x00000040
Packit 1fb8d4
#define STARTF_FORCEOFFFEEDBACK     0x00000080
Packit 1fb8d4
#define STARTF_USESTDHANDLES        0x00000100
Packit 1fb8d4
#define STARTF_USEHOTKEY            0x00000200
Packit 1fb8d4
#define STARTF_TITLEISLINKNAME      0x00000800
Packit 1fb8d4
#define STARTF_TITLEISAPPID         0x00001000
Packit 1fb8d4
#define STARTF_PREVENTPINNING       0x00002000
Packit 1fb8d4
Packit 1fb8d4
/* Process */
Packit 1fb8d4
Packit 1fb8d4
#define LOGON_WITH_PROFILE			0x00000001
Packit 1fb8d4
#define LOGON_NETCREDENTIALS_ONLY		0x00000002
Packit 1fb8d4
#define LOGON_ZERO_PASSWORD_BUFFER		0x80000000
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
Packit 1fb8d4
		LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment,
Packit 1fb8d4
		LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
Packit 1fb8d4
		LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment,
Packit 1fb8d4
		LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL CreateProcessAsUserA(HANDLE hToken, LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
Packit 1fb8d4
		LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment,
Packit 1fb8d4
		LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL CreateProcessAsUserW(HANDLE hToken, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
Packit 1fb8d4
		LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment,
Packit 1fb8d4
		LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL CreateProcessWithLogonA(LPCSTR lpUsername, LPCSTR lpDomain, LPCSTR lpPassword, DWORD dwLogonFlags,
Packit 1fb8d4
		LPCSTR lpApplicationName, LPSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment,
Packit 1fb8d4
		LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL CreateProcessWithLogonW(LPCWSTR lpUsername, LPCWSTR lpDomain, LPCWSTR lpPassword, DWORD dwLogonFlags,
Packit 1fb8d4
		LPCWSTR lpApplicationName, LPWSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment,
Packit 1fb8d4
		LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL CreateProcessWithTokenA(HANDLE hToken, DWORD dwLogonFlags,
Packit 1fb8d4
		LPCSTR lpApplicationName, LPSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment,
Packit 1fb8d4
		LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL CreateProcessWithTokenW(HANDLE hToken, DWORD dwLogonFlags,
Packit 1fb8d4
		LPCWSTR lpApplicationName, LPWSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment,
Packit 1fb8d4
		LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
Packit 1fb8d4
Packit 1fb8d4
#ifdef UNICODE
Packit 1fb8d4
#define CreateProcess		CreateProcessW
Packit 1fb8d4
#define CreateProcessAsUser	CreateProcessAsUserW
Packit 1fb8d4
#define CreateProcessWithLogon	CreateProcessWithLogonW
Packit 1fb8d4
#define CreateProcessWithToken	CreateProcessWithTokenW
Packit 1fb8d4
#else
Packit 1fb8d4
#define CreateProcess		CreateProcessA
Packit 1fb8d4
#define CreateProcessAsUser	CreateProcessAsUserA
Packit 1fb8d4
#define CreateProcessWithLogon	CreateProcessWithLogonA
Packit 1fb8d4
#define CreateProcessWithToken	CreateProcessWithTokenA
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
DECLSPEC_NORETURN WINPR_API VOID ExitProcess(UINT uExitCode);
Packit 1fb8d4
WINPR_API BOOL GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API HANDLE _GetCurrentProcess(void);
Packit 1fb8d4
WINPR_API DWORD GetCurrentProcessId(void);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode);
Packit 1fb8d4
Packit 1fb8d4
/* Process Argument Vector Parsing */
Packit 1fb8d4
Packit 1fb8d4
WINPR_API LPWSTR* CommandLineToArgvW(LPCWSTR lpCmdLine, int* pNumArgs);
Packit 1fb8d4
Packit 1fb8d4
#ifdef UNICODE
Packit 1fb8d4
#define CommandLineToArgv	CommandLineToArgvW
Packit 1fb8d4
#else
Packit 1fb8d4
#define CommandLineToArgv	CommandLineToArgvA
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
/* Thread */
Packit 1fb8d4
Packit 1fb8d4
#define CREATE_SUSPENDED				0x00000004
Packit 1fb8d4
#define STACK_SIZE_PARAM_IS_A_RESERVATION		0x00010000
Packit 1fb8d4
Packit 1fb8d4
WINPR_API HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize,
Packit 1fb8d4
	LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API HANDLE CreateRemoteThread(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize,
Packit 1fb8d4
		LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API DECLSPEC_NORETURN VOID ExitThread(DWORD dwExitCode);
Packit 1fb8d4
WINPR_API BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API HANDLE _GetCurrentThread(void);
Packit 1fb8d4
WINPR_API DWORD GetCurrentThreadId(void);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API DWORD ResumeThread(HANDLE hThread);
Packit 1fb8d4
WINPR_API DWORD SuspendThread(HANDLE hThread);
Packit 1fb8d4
WINPR_API BOOL SwitchToThread(void);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);
Packit 1fb8d4
Packit 1fb8d4
/* Processor */
Packit 1fb8d4
Packit 1fb8d4
WINPR_API DWORD GetCurrentProcessorNumber(void);
Packit 1fb8d4
Packit 1fb8d4
/* Thread-Local Storage */
Packit 1fb8d4
Packit 1fb8d4
#define TLS_OUT_OF_INDEXES	((DWORD) 0xFFFFFFFF)
Packit 1fb8d4
Packit 1fb8d4
WINPR_API DWORD TlsAlloc(void);
Packit 1fb8d4
WINPR_API LPVOID TlsGetValue(DWORD dwTlsIndex);
Packit 1fb8d4
WINPR_API BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue);
Packit 1fb8d4
WINPR_API BOOL TlsFree(DWORD dwTlsIndex);
Packit 1fb8d4
Packit 1fb8d4
#else
Packit 1fb8d4
Packit 1fb8d4
/*
Packit 1fb8d4
 * GetCurrentProcess / GetCurrentThread cause a conflict on Mac OS X
Packit 1fb8d4
 */
Packit 1fb8d4
#define _GetCurrentProcess	GetCurrentProcess
Packit 1fb8d4
#define _GetCurrentThread	GetCurrentThread
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
/* CommandLineToArgvA is not present in the original Windows API, WinPR always exports it */
Packit 1fb8d4
Packit 1fb8d4
WINPR_API LPSTR *CommandLineToArgvA(LPCSTR lpCmdLine, int *pNumArgs);
Packit 1fb8d4
Packit 1fb8d4
#if defined(WITH_DEBUG_THREADS)
Packit 1fb8d4
WINPR_API VOID DumpThreadHandles(void);
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#ifdef __cplusplus
Packit 1fb8d4
}
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#endif /* WINPR_THREAD_H */
Packit 1fb8d4