Files
nt-lite/code/user/personalities/win32/ole32.c
T

73 lines
2.1 KiB
C

// Win32 OLE compatibility stubs. This file satisfies applications that probe COM initialization paths.
#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
#include <ntlite/syscall.h>
// Types.
typedef long HRESULT;
typedef void* IUnknown;
#define S_OK ((HRESULT)0x00000000L)
#define E_NOTIMPL ((HRESULT)0x80004001L)
#define E_OUTOFMEMORY ((HRESULT)0x8007000EL)
#define COINIT_MULTITHREADED 0x0
// GUID - 16-byte COM interface identifier.
typedef struct {
unsigned int Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} GUID;
// PROPVARIANT - variant type used by shell / media APIs.
typedef struct {
unsigned short vt;
unsigned short wReserved1, wReserved2, wReserved3;
union {
long long hVal;
double dblVal;
void* punkVal;
unsigned char bVal;
unsigned int ulVal;
// ... (only common fields; full union is ~16 bytes).
unsigned char padding[16];
};
} PROPVARIANT;
// COM initialisation.
__declspec(dllexport) HRESULT CoInitializeEx(void* reserved, unsigned long coInit) {
(void)reserved; (void)coInit;
return S_OK; // Pretend success; no actual apartment is created.
}
// Implements the co Uninitialize operation.
__declspec(dllexport) void CoUninitialize(void) {
// No-op.
}
// Object creation.
__declspec(dllexport) HRESULT CoCreateInstance(const GUID* clsid, IUnknown* outer,
unsigned long ctx, const GUID* iid,
void** ppv) {
(void)clsid; (void)outer; (void)ctx; (void)iid;
if (ppv) *ppv = (void*)0;
return E_NOTIMPL;
}
// Memory.
__declspec(dllexport) void CoTaskMemFree(void* pv) {
if (pv) free(pv);
}
// PROPVARIANT.
__declspec(dllexport) HRESULT PropVariantClear(PROPVARIANT* pvar) {
if (!pvar) return E_NOTIMPL;
// Zero the entire structure; no deep release needed for stub types.
unsigned char* p = (unsigned char*)pvar;
for (size_t i = 0; i < sizeof(*pvar); i++) p[i] = 0;
return S_OK;
}