351 lines
8.2 KiB
C
351 lines
8.2 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
nativcom.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Public header for COM-marshaling facilities provided by msjava.dll.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _NATIVCOM_
|
||
|
#define _NATIVCOM_
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <native.h>
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// COM and J/Direct data wrapper helpers...
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
// Replaces the data pointer contained in the data wrapper with a new blob of
|
||
|
// non-GC'ed heap memory. The previous blob, if any, will be freed if its
|
||
|
// owned by the VM.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
void*
|
||
|
__cdecl
|
||
|
jcdwNewData(
|
||
|
HObject * phJCDW,
|
||
|
unsigned int numBytes
|
||
|
);
|
||
|
|
||
|
// Returns the data pointer to the non GC'ed heap memory contained by the data
|
||
|
// wrapper object.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
void*
|
||
|
__cdecl
|
||
|
jcdwGetData(
|
||
|
HObject *phJCDW
|
||
|
);
|
||
|
|
||
|
// Replaces the data pointer that this data wrapper represents with the
|
||
|
// specified
|
||
|
|
||
|
JAVAVMAPI
|
||
|
int
|
||
|
__cdecl
|
||
|
jcdwSetData(
|
||
|
HObject *phJCDW,
|
||
|
LPVOID pv
|
||
|
);
|
||
|
|
||
|
// Returns TRUE if the VM allocated the non GC'ed heap memory contained by the
|
||
|
// data wrapper.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
int
|
||
|
__cdecl
|
||
|
jcdw_memory_freed_on_gc(
|
||
|
HObject *phJCDW
|
||
|
);
|
||
|
|
||
|
// Returns TRUE if the VM frees the non GC'ed heap memory that this data
|
||
|
// wrapper contains when the data wrapper is garbage collected.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
int
|
||
|
__cdecl
|
||
|
jcdw_java_owned(
|
||
|
HObject *phJCDW
|
||
|
);
|
||
|
|
||
|
// Returns the size of the non GC'ed heap memory contained by the data wrapper
|
||
|
// object.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
unsigned int
|
||
|
__cdecl
|
||
|
jcdwSizeOf(
|
||
|
HObject *phJCDW
|
||
|
);
|
||
|
|
||
|
// Returns the size of the non GC'ed heap memory used by instances of the
|
||
|
// supplied java/lang/Class object.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
unsigned int
|
||
|
__cdecl
|
||
|
jcdwClassSizeOf(
|
||
|
HObject *phJavaClass
|
||
|
);
|
||
|
|
||
|
// Returns the byte offset within the non GC'ed heap memory to the specified
|
||
|
// field name.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
unsigned int
|
||
|
__cdecl
|
||
|
jcdwOffsetOf(
|
||
|
HObject *phJCDW,
|
||
|
PCUTF8 putfFieldName
|
||
|
);
|
||
|
|
||
|
// Returns the byte offset within the non GC'ed heap memory to the specified
|
||
|
// field name from the supplied java/lang/Class object.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
unsigned int
|
||
|
__cdecl
|
||
|
jcdwClassOffsetOf(
|
||
|
HObject *phJCDWClass,
|
||
|
PCUTF8 putfFieldName
|
||
|
);
|
||
|
|
||
|
// Given an object, propagates field values from the Java object to the object's
|
||
|
// associated native memory.
|
||
|
// Returns FALSE on error, else TRUE.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
int
|
||
|
__cdecl
|
||
|
jcdwPropagateToNative(
|
||
|
HObject *phJCDW
|
||
|
);
|
||
|
|
||
|
// Given an object, propagates field values from the object's associated native
|
||
|
// memory to the Java object. If fFreeIndirectNativeMemory is TRUE, the native
|
||
|
// memory used for any reference fields (Strings, custom marshaled fields, ...)
|
||
|
// will be released.
|
||
|
// Returns FALSE on error, else TRUE.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
int
|
||
|
__cdecl
|
||
|
jcdwPropagateToJava(
|
||
|
HObject *phJCDW,
|
||
|
BOOL fFreeIndirectNativeMemory
|
||
|
);
|
||
|
|
||
|
// Returns a Java callable wrapper that can be used to access the specified
|
||
|
// interface pointer. The VM will keep a reference to this interface pointer.
|
||
|
// If 'fAssumeThreadSafe' is FALSE, the VM will auto-marshal all COM calls to
|
||
|
// the current COM context.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
HObject *
|
||
|
__cdecl
|
||
|
convert_IUnknown_to_Java_Object(
|
||
|
IUnknown *punk,
|
||
|
HObject *phJavaClass,
|
||
|
int fAssumeThreadSafe
|
||
|
);
|
||
|
|
||
|
// Returns a Java callable wrapper that can be used to access the specified
|
||
|
// interface pointer. The VM will keep a reference to this interface pointer.
|
||
|
// If 'fAssumeThreadSafe' is FALSE, the VM will auto-marshal all COM calls to
|
||
|
// the current COM context.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
HObject *
|
||
|
__cdecl
|
||
|
convert_IUnknown_to_Java_Object2(
|
||
|
IUnknown *punk,
|
||
|
ClassClass *pClassClass,
|
||
|
int fFreeThreaded
|
||
|
);
|
||
|
|
||
|
// Returns an interface pointer usable from the current COM context.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
IUnknown *
|
||
|
__cdecl
|
||
|
convert_Java_Object_to_IUnknown(
|
||
|
HObject *phJavaObject,
|
||
|
const IID *pIID
|
||
|
);
|
||
|
|
||
|
// Returns a data wrapper object of the supplied Class type that points at the
|
||
|
// supplied data pointer. The memory is not owned by the VM.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
HObject *
|
||
|
__cdecl
|
||
|
convert_ptr_to_jcdw(
|
||
|
void *pExtData,
|
||
|
HObject *phJavaClass
|
||
|
);
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Map HRESULT to ComException.
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
JAVAVMAPI
|
||
|
void
|
||
|
__cdecl
|
||
|
SignalErrorHResult(
|
||
|
HRESULT theHRESULT
|
||
|
);
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Map Java exception to HRESULT.
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
JAVAVMAPI
|
||
|
HRESULT
|
||
|
__cdecl
|
||
|
HResultFromException(
|
||
|
HObject *exception_object
|
||
|
);
|
||
|
|
||
|
typedef HObject *JAVAARG;
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Information structure for Java->COM Custom Method hook.
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
typedef struct {
|
||
|
DWORD cbSize; // size of structure in bytes
|
||
|
IUnknown *punk; // pointer to interface being invoked
|
||
|
const volatile JAVAARG *pJavaArgs; // pointer to Java argument stack
|
||
|
} J2CMethodHookInfo;
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Information structure for COM->Java Custom Method hook.
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
typedef struct {
|
||
|
DWORD cbSize; // size of structure in bytes
|
||
|
struct methodblock *javaMethod; // java method to call
|
||
|
LPVOID pComArgs; // pointer to COM method argument stack
|
||
|
const volatile JAVAARG *ppThis; // pointer to pointer to Java this
|
||
|
|
||
|
// Store the COM result here.
|
||
|
union {
|
||
|
HRESULT resHR;
|
||
|
DWORD resDWORD;
|
||
|
double resDouble;
|
||
|
};
|
||
|
} C2JMethodHookInfo;
|
||
|
|
||
|
JAVAVMAPI
|
||
|
WORD
|
||
|
__cdecl
|
||
|
j2chook_getsizeofuserdata(
|
||
|
J2CMethodHookInfo *phookinfo
|
||
|
);
|
||
|
|
||
|
JAVAVMAPI
|
||
|
LPVOID
|
||
|
__cdecl
|
||
|
j2chook_getuserdata(
|
||
|
J2CMethodHookInfo *phookinfo
|
||
|
);
|
||
|
|
||
|
// Returns the vtable index of the target method.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
WORD
|
||
|
__cdecl
|
||
|
j2chook_getvtblindex(
|
||
|
J2CMethodHookInfo *phookinfo
|
||
|
);
|
||
|
|
||
|
// Returns the methodblock of the target method.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
struct methodblock*
|
||
|
__cdecl
|
||
|
j2chook_getmethodblock(
|
||
|
J2CMethodHookInfo *phookinfo
|
||
|
);
|
||
|
|
||
|
JAVAVMAPI
|
||
|
WORD
|
||
|
__cdecl
|
||
|
c2jhook_getsizeofuserdata(
|
||
|
C2JMethodHookInfo *phookinfo
|
||
|
);
|
||
|
|
||
|
JAVAVMAPI
|
||
|
LPVOID
|
||
|
__cdecl
|
||
|
c2jhook_getuserdata(
|
||
|
C2JMethodHookInfo *phookinfo
|
||
|
);
|
||
|
|
||
|
// Returns the class defining the interface method. This is the class
|
||
|
// containing the MCCustomMethod descriptor.
|
||
|
|
||
|
JAVAVMAPI
|
||
|
ClassClass *
|
||
|
__cdecl
|
||
|
c2jhook_getexposingclass(
|
||
|
C2JMethodHookInfo *phookinfo
|
||
|
);
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Thread marshaling helpers
|
||
|
//
|
||
|
// The MarshalCall<> APIs will reexecute the RNI method on the supplied thread
|
||
|
// id or on the apartment thread for the supplied Java object. The APIs will
|
||
|
// return the following sets of HRESULTS:
|
||
|
//
|
||
|
// S_OK The call successfully was marshaled to the target thread.
|
||
|
// The marshaled call may have generated an exception, which can
|
||
|
// bechecked by calling exceptionOccurred.
|
||
|
// S_FALSE The call did not require marshaling to the other thread--
|
||
|
// the currently executing thread is the target thread.
|
||
|
// E_<> An error occurred inside the MarshalCall<> API (invalid
|
||
|
// arguments, out of memory, etc).
|
||
|
//
|
||
|
// The typical use of these APIs is to call the appropriate MarshalCall<> API
|
||
|
// and if the HRESULT is S_FALSE, then execute the rest of the RNI method,
|
||
|
// otherwise return with the value contained in pResult.
|
||
|
//----------------------------------------------------------------------------
|
||
|
typedef void * JAVATID;
|
||
|
|
||
|
#define JAVATID_MAIN_APARTMENT ((JAVATID) 0x00000001)
|
||
|
#define JAVATID_SERVER_APARTMENT ((JAVATID) 0x00000002)
|
||
|
|
||
|
JAVAVMAPI
|
||
|
HRESULT
|
||
|
__cdecl
|
||
|
MarshalCallToJavaThreadId(
|
||
|
JAVATID tid,
|
||
|
int64_t *pResult
|
||
|
);
|
||
|
|
||
|
JAVAVMAPI
|
||
|
HRESULT
|
||
|
__cdecl
|
||
|
MarshalCallToJavaObjectHostThread(
|
||
|
HObject *phobj,
|
||
|
int64_t *pResult
|
||
|
);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif
|