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.

201 lines
8.3 KiB

/*
* w32dll-emu.h -- w32dll.c internal header file for Win32 emulation
* Written by Andrew Church <achurch@achurch.org>
*
* This file is part of transcode, a video stream processing tool.
* transcode is free software, distributable under the terms of the GNU
* General Public License (version 2 or later). See the file COPYING
* for details.
*/
#ifndef W32DLL_EMU_H
#define W32DLL_EMU_H
/*************************************************************************/
/* Function pointer return types. (Note that on the whole, we avoid using
* Windows types in favor of standard ANSI types like uint32_t.) */
typedef CALLBACK long (*FARPROC)(void);
/*************************************************************************/
/* Various constants. */
/* Local handle constants. HANDLE_DEFAULT (for the DLL itself) is defined
* in w32dll-local.h. */
#define HANDLE_KERNEL32 2
#define HANDLE_USER32 3
#define HANDLE_WINDOW 101
#define HANDLE_HEAP 201
#define HANDLE_STDIN 301
#define HANDLE_STDOUT 302
#define HANDLE_STDERR 303
#define HANDLE_SEMAPHORE 401
#define HANDLE_MAXLOCAL 4095
#define INVALID_HANDLE_VALUE (~0)
#define TLS_MINIMUM_AVAILABLE 64
#define ERROR_UNKNOWN 99999
#define NO_ERROR 0
#define ERROR_INVALID_FUNCTION 1
#define ERROR_FILE_NOT_FOUND 2
#define ERROR_ACCESS_DENIED 5
#define ERROR_INVALID_HANDLE 6
#define ERROR_NOT_ENOUGH_MEMORY 8
#define ERROR_INVALID_ACCESS 12
#define ERROR_OUTOFMEMORY 14
#define ERROR_WRITE_FAULT 29
#define ERROR_INVALID_PARAMETER 87
#define ERROR_BROKEN_PIPE 109
#define ERROR_DISK_FULL 112
#define ERROR_INSUFFICIENT_BUFFER 122
#define ERROR_IO_PENDING 997
/*************************************************************************/
/* Various structures. */
typedef struct {
unsigned int maxbytes;
uint8_t defchar[2];
uint8_t leadbytes[12];
} CPINFO;
typedef struct {
uint32_t size;
uint32_t major; // set to 5
uint32_t minor; // set to 0 (5.0: Windows 2000)
uint32_t build; // can be anything
uint32_t platform; // set to 2 (VER_PLATFORM_WIN32_NT)
char extra[128];
uint16_t sp_major; // set to 4 (W2k SP4)
uint16_t sp_minor; // set to 0
uint16_t suite; // set to 0
uint8_t type; // set to 0x01 (VER_NT_WORKSTATION)
uint8_t reserved;
} OSVERSIONINFOEX;
typedef struct {
uint32_t size;
char *reserved;
char *desktop;
char *title;
uint32_t x, y, w, h, wchars, hchars, fill;
uint32_t flags;
uint16_t show;
uint16_t reserved2;
uint8_t *reserved3;
uint32_t h_stdin;
uint32_t h_stdout;
uint32_t h_stderr;
} STARTUPINFO;
/*************************************************************************/
/* Emulated function prototypes (these are all static within w32dll-emu.c). */
/**** KERNEL32.dll ****/
static WINAPI int CloseHandle(uint32_t handle);
static WINAPI uint32_t CreateSemaphoreA(void *attr, uint32_t initial,
uint32_t max, const char *name);
static WINAPI uint32_t CreateSemaphoreW(void *attr, uint32_t initial,
uint32_t max, const uint16_t *name);
static WINAPI void DeleteCriticalSection(void *lock);
static WINAPI void EnterCriticalSection(void *lock);
static WINAPI void ExitProcess(unsigned int exitcode);
static WINAPI int FreeEnvironmentStringsA(void *env);
static WINAPI int FreeEnvironmentStringsW(void *env);
static WINAPI unsigned int
GetACP(void);
static WINAPI int GetCPInfo(unsigned int codepage, CPINFO *result);
static WINAPI char * GetCommandLineA(void);
static WINAPI int GetConsoleMode(uint32_t file, uint16_t *result);
static WINAPI uint32_t GetCurrentProcessId(void);
static WINAPI uint32_t GetCurrentThreadId(void);
static WINAPI void * GetEnvironmentStringsA(void);
static WINAPI void * GetEnvironmentStringsW(void);
static WINAPI uint32_t GetFileType(uint32_t file);
static WINAPI uint32_t GetLastError(void);
static WINAPI uint32_t GetModuleFileNameA(uint32_t module, char *buf,
uint32_t size);
static WINAPI uint32_t GetModuleHandleA(const char *name);
static WINAPI FARPROC GetProcAddress(uint32_t handle, const char *name);
static WINAPI uint32_t GetProcessHeap(void);
static WINAPI void GetStartupInfoA(STARTUPINFO *result);
static WINAPI uint32_t GetStdHandle(uint32_t index);
static WINAPI int GetStringTypeW(uint32_t type, const uint16_t *str,
int len, uint16_t *typebuf);
static WINAPI void GetSystemTimeAsFileTime(uint64_t *result);
static WINAPI uint32_t GetTickCount(void);
static WINAPI int GetVersionExA(OSVERSIONINFOEX *result);
static WINAPI void * HeapAlloc(uint32_t heap, uint32_t flags, size_t size);
static WINAPI uint32_t HeapCreate(uint32_t flags, size_t initial, size_t max);
static WINAPI int HeapDestroy(uint32_t heap);
static WINAPI int HeapFree(uint32_t heap, uint32_t flags, void *ptr);
static WINAPI void * HeapReAlloc(uint32_t heap, uint32_t flags, void *ptr,
size_t size);
static WINAPI uint32_t HeapSize(uint32_t heap, uint32_t flags, const void*ptr);
static WINAPI int32_t InterlockedCompareExchange
(int32_t *var, int32_t testval, int32_t newval);
static WINAPI void * InterlockedCompareExchangePointer
(void ***var, void *testval, void *newval);
static WINAPI int32_t InterlockedDecrement(int32_t *var);
static WINAPI int32_t InterlockedExchange(int32_t *var, int32_t newval);
static WINAPI int32_t InterlockedExchangeAdd(int32_t *var, int32_t addval);
static WINAPI void * InterlockedExchangePointer(void **var, void *newval);
static WINAPI int32_t InterlockedIncrement(int32_t *var);
static WINAPI int32_t InterlockedTestExchange(int32_t *var, int32_t testval,
int32_t newval);
static WINAPI void InitializeCriticalSection(void *lock);
static WINAPI int LCMapStringA
(uint32_t locale, uint32_t flags, const char *in, int inlen,
char *out, int outsize);
static WINAPI int LCMapStringW
(uint32_t locale, uint32_t flags, const uint16_t *in, int inlen,
uint16_t *out, int outsize);
static WINAPI void LeaveCriticalSection(void *lock);
static WINAPI uint32_t LoadLibraryA(char *filename);
static WINAPI int MultiByteToWideChar
(unsigned int codepage, uint32_t flags, const unsigned char *in,
int inlen, uint16_t *out, int outsize);
static WINAPI uint32_t QueryPerformanceCounter(int64_t *result);
static WINAPI int ReleaseSemaphore(uint32_t sem, int32_t release_count,
int32_t *previous);
static WINAPI void SetHandleCount(uint32_t count);
static WINAPI void SetLastError(uint32_t error);
static WINAPI uint32_t TlsAlloc(void);
static WINAPI int TlsFree(uint32_t index);
static WINAPI void * TlsGetValue(uint32_t index);
static WINAPI int TlsSetValue(uint32_t index, void *value);
static WINAPI uint32_t WaitForSingleObject(uint32_t handle, uint32_t msec);
static WINAPI int WideCharToMultiByte
(unsigned int codepage, uint32_t flags, const uint16_t *in, int inlen,
char *out, int outsize, const char *defchar, int *defchar_used);
static WINAPI int WriteFile(uint32_t file, const void *buf, uint32_t len,
uint32_t *written, void *overlapped);
/**** USER32.dll ****/
static WINAPI uint32_t GetActiveWindow(void);
static WINAPI int MessageBoxA(uint32_t window, const char *text,
const char *title, unsigned int type);
static WINAPI int MessageBoxW(uint32_t window, const uint16_t *text,
const uint16_t *title, unsigned int type);
/*************************************************************************/
#endif /* W32DLL_EMU_H */
/*
* Local variables:
* c-file-style: "stroustrup"
* c-file-offsets: ((case-label . *) (statement-case-intro . *))
* indent-tabs-mode: nil
* End:
*
* vim: expandtab shiftwidth=4:
*/