Sandboxie/SandboxiePlus/MiscHelpers/Archive/7z/CPP/Common/MyWindows.h

325 lines
7.3 KiB
C
Raw Normal View History

2022-11-12 09:45:35 +00:00
// MyWindows.h
2023-09-14 16:51:54 +01:00
#ifdef Z7_DEFINE_GUID
#undef Z7_DEFINE_GUID
#endif
#ifdef INITGUID
#define Z7_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID name; \
EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#else
#define Z7_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID name
#endif
#ifndef ZIP7_INC_MY_WINDOWS_H
#define ZIP7_INC_MY_WINDOWS_H
2022-11-12 09:45:35 +00:00
#ifdef _WIN32
2023-09-14 16:51:54 +01:00
#include "../../C/7zWindows.h"
2022-11-12 09:45:35 +00:00
2023-09-14 16:51:54 +01:00
#else // _WIN32
2022-11-12 09:45:35 +00:00
#include <stddef.h> // for wchar_t
#include <string.h>
2023-09-14 16:51:54 +01:00
// #include <stdint.h> // for uintptr_t
2022-11-12 09:45:35 +00:00
2023-09-14 16:51:54 +01:00
#include "../../C/7zTypes.h"
2022-11-12 09:45:35 +00:00
#include "MyGuidDef.h"
2023-09-14 16:51:54 +01:00
// WINAPI is __stdcall in Windows-MSVC in windef.h
#define WINAPI
2022-11-12 09:45:35 +00:00
typedef char CHAR;
typedef unsigned char UCHAR;
#undef BYTE
typedef unsigned char BYTE;
typedef short SHORT;
typedef unsigned short USHORT;
#undef WORD
typedef unsigned short WORD;
typedef short VARIANT_BOOL;
2023-09-14 16:51:54 +01:00
#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff))
#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))
// MS uses long for BOOL, but long is 32-bit in MS. So we use int.
// typedef long BOOL;
typedef int BOOL;
#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif
2022-11-12 09:45:35 +00:00
2023-09-14 16:51:54 +01:00
// typedef size_t ULONG_PTR;
// typedef size_t DWORD_PTR;
// typedef uintptr_t UINT_PTR;
// typedef ptrdiff_t UINT_PTR;
2022-11-12 09:45:35 +00:00
typedef Int64 LONGLONG;
typedef UInt64 ULONGLONG;
2023-09-14 16:51:54 +01:00
typedef struct _LARGE_INTEGER { LONGLONG QuadPart; } LARGE_INTEGER;
typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart; } ULARGE_INTEGER;
2022-11-12 09:45:35 +00:00
typedef const CHAR *LPCSTR;
typedef CHAR TCHAR;
typedef const TCHAR *LPCTSTR;
typedef wchar_t WCHAR;
typedef WCHAR OLECHAR;
typedef const WCHAR *LPCWSTR;
typedef OLECHAR *BSTR;
typedef const OLECHAR *LPCOLESTR;
typedef OLECHAR *LPOLESTR;
typedef struct _FILETIME
{
DWORD dwLowDateTime;
DWORD dwHighDateTime;
2023-09-14 16:51:54 +01:00
} FILETIME;
2022-11-12 09:45:35 +00:00
2023-09-14 16:51:54 +01:00
#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)
#define FAILED(hr) ((HRESULT)(hr) < 0)
2022-11-12 09:45:35 +00:00
typedef ULONG PROPID;
typedef LONG SCODE;
2023-09-14 16:51:54 +01:00
2022-11-12 09:45:35 +00:00
#define S_OK ((HRESULT)0x00000000L)
#define S_FALSE ((HRESULT)0x00000001L)
2023-09-14 16:51:54 +01:00
#define E_NOTIMPL ((HRESULT)0x80004001L)
2022-11-12 09:45:35 +00:00
#define E_NOINTERFACE ((HRESULT)0x80004002L)
2023-09-14 16:51:54 +01:00
#define E_ABORT ((HRESULT)0x80004004L)
#define E_FAIL ((HRESULT)0x80004005L)
#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L)
#define CLASS_E_CLASSNOTAVAILABLE ((HRESULT)0x80040111L)
2022-11-12 09:45:35 +00:00
#ifdef _MSC_VER
#define STDMETHODCALLTYPE __stdcall
2023-09-14 16:51:54 +01:00
#define STDAPICALLTYPE __stdcall
2022-11-12 09:45:35 +00:00
#else
2023-09-14 16:51:54 +01:00
// do we need __export here?
2022-11-12 09:45:35 +00:00
#define STDMETHODCALLTYPE
2023-09-14 16:51:54 +01:00
#define STDAPICALLTYPE
2022-11-12 09:45:35 +00:00
#endif
2023-09-14 16:51:54 +01:00
#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
#ifndef DECLSPEC_NOTHROW
#define DECLSPEC_NOTHROW Z7_DECLSPEC_NOTHROW
#endif
#ifndef DECLSPEC_NOVTABLE
#define DECLSPEC_NOVTABLE Z7_DECLSPEC_NOVTABLE
#endif
#ifndef COM_DECLSPEC_NOTHROW
#ifdef COM_STDMETHOD_CAN_THROW
#define COM_DECLSPEC_NOTHROW
#else
#define COM_DECLSPEC_NOTHROW DECLSPEC_NOTHROW
#endif
#endif
#define DECLARE_INTERFACE(iface) struct DECLSPEC_NOVTABLE iface
#define DECLARE_INTERFACE_(iface, baseiface) struct DECLSPEC_NOVTABLE iface : public baseiface
#define STDMETHOD_(t, f) virtual COM_DECLSPEC_NOTHROW t STDMETHODCALLTYPE f
#define STDMETHOD(f) STDMETHOD_(HRESULT, f)
#define STDMETHODIMP_(t) COM_DECLSPEC_NOTHROW t STDMETHODCALLTYPE
#define STDMETHODIMP STDMETHODIMP_(HRESULT)
2022-11-12 09:45:35 +00:00
#define PURE = 0
2023-09-14 16:51:54 +01:00
// #define MIDL_INTERFACE(x) struct
2022-11-12 09:45:35 +00:00
#ifdef __cplusplus
2023-09-14 16:51:54 +01:00
/*
p7zip and 7-Zip before v23 used virtual destructor in IUnknown,
if _WIN32 is not defined.
It used virtual destructor, because some compilers don't like virtual
interfaces without virtual destructor.
IUnknown in Windows (_WIN32) doesn't use virtual destructor in IUnknown.
We still can define Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN here,
if we want to be compatible with old plugin interface of p7zip and 7-Zip before v23.
v23:
In new 7-Zip v23 we try to be more compatible with original IUnknown from _WIN32.
So we do not define Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN here,
*/
// #define Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN
#ifdef Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN
#if defined(__clang__)
#pragma GCC diagnostic ignored "-Winconsistent-missing-destructor-override"
#endif
#endif
Z7_PURE_INTERFACES_BEGIN
2022-11-12 09:45:35 +00:00
DEFINE_GUID(IID_IUnknown,
0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
struct IUnknown
{
2023-09-14 16:51:54 +01:00
STDMETHOD(QueryInterface) (REFIID iid, void **outObject) =0;
STDMETHOD_(ULONG, AddRef)() =0;
STDMETHOD_(ULONG, Release)() =0;
#ifdef Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN
2022-11-12 09:45:35 +00:00
virtual ~IUnknown() {}
2023-09-14 16:51:54 +01:00
#endif
2022-11-12 09:45:35 +00:00
};
typedef IUnknown *LPUNKNOWN;
2023-09-14 16:51:54 +01:00
Z7_PURE_INTERFACES_END
#endif // __cplusplus
2022-11-12 09:45:35 +00:00
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
enum VARENUM
{
VT_EMPTY = 0,
VT_NULL = 1,
VT_I2 = 2,
VT_I4 = 3,
VT_R4 = 4,
VT_R8 = 5,
VT_CY = 6,
VT_DATE = 7,
VT_BSTR = 8,
VT_DISPATCH = 9,
VT_ERROR = 10,
VT_BOOL = 11,
VT_VARIANT = 12,
VT_UNKNOWN = 13,
VT_DECIMAL = 14,
2023-09-14 16:51:54 +01:00
2022-11-12 09:45:35 +00:00
VT_I1 = 16,
VT_UI1 = 17,
VT_UI2 = 18,
VT_UI4 = 19,
VT_I8 = 20,
VT_UI8 = 21,
VT_INT = 22,
VT_UINT = 23,
VT_VOID = 24,
VT_HRESULT = 25,
VT_FILETIME = 64
};
typedef unsigned short VARTYPE;
typedef WORD PROPVAR_PAD1;
typedef WORD PROPVAR_PAD2;
typedef WORD PROPVAR_PAD3;
typedef struct tagPROPVARIANT
{
VARTYPE vt;
PROPVAR_PAD1 wReserved1;
PROPVAR_PAD2 wReserved2;
PROPVAR_PAD3 wReserved3;
union
{
CHAR cVal;
UCHAR bVal;
SHORT iVal;
USHORT uiVal;
LONG lVal;
ULONG ulVal;
INT intVal;
UINT uintVal;
LARGE_INTEGER hVal;
ULARGE_INTEGER uhVal;
VARIANT_BOOL boolVal;
SCODE scode;
FILETIME filetime;
BSTR bstrVal;
};
} PROPVARIANT;
typedef PROPVARIANT tagVARIANT;
typedef tagVARIANT VARIANT;
typedef VARIANT VARIANTARG;
2023-09-14 16:51:54 +01:00
EXTERN_C HRESULT VariantClear(VARIANTARG *prop);
EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, const VARIANTARG *src);
2022-11-12 09:45:35 +00:00
2023-09-14 16:51:54 +01:00
typedef struct tagSTATPROPSTG
{
LPOLESTR lpwstrName;
PROPID propid;
VARTYPE vt;
} STATPROPSTG;
EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len);
EXTERN_C BSTR SysAllocStringLen(const OLECHAR *sz, UINT len);
EXTERN_C BSTR SysAllocString(const OLECHAR *sz);
EXTERN_C void SysFreeString(BSTR bstr);
EXTERN_C UINT SysStringByteLen(BSTR bstr);
EXTERN_C UINT SysStringLen(BSTR bstr);
2022-11-12 09:45:35 +00:00
2023-09-14 16:51:54 +01:00
EXTERN_C DWORD GetLastError();
EXTERN_C void SetLastError(DWORD dwCode);
EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2);
2022-11-12 09:45:35 +00:00
2023-09-14 16:51:54 +01:00
EXTERN_C DWORD GetCurrentThreadId();
EXTERN_C DWORD GetCurrentProcessId();
#define MAX_PATH 1024
2022-11-12 09:45:35 +00:00
#define CP_ACP 0
#define CP_OEMCP 1
2023-09-14 16:51:54 +01:00
#define CP_UTF8 65001
2022-11-12 09:45:35 +00:00
typedef enum tagSTREAM_SEEK
{
STREAM_SEEK_SET = 0,
STREAM_SEEK_CUR = 1,
STREAM_SEEK_END = 2
} STREAM_SEEK;
2023-09-14 16:51:54 +01:00
typedef struct _SYSTEMTIME
{
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;
BOOL WINAPI FileTimeToLocalFileTime(const FILETIME *fileTime, FILETIME *localFileTime);
BOOL WINAPI LocalFileTimeToFileTime(const FILETIME *localFileTime, FILETIME *fileTime);
BOOL WINAPI FileTimeToSystemTime(const FILETIME *fileTime, SYSTEMTIME *systemTime);
// VOID WINAPI GetSystemTimeAsFileTime(FILETIME *systemTimeAsFileTime);
DWORD GetTickCount();
#define CREATE_NEW 1
#define CREATE_ALWAYS 2
#define OPEN_EXISTING 3
#define OPEN_ALWAYS 4
#define TRUNCATE_EXISTING 5
#endif // _WIN32
2022-11-12 09:45:35 +00:00
#endif