//+============================================================================ // // PropFwd.c // // This file provides (slow) forwarders of the NT4 property APIs // from NTDLL to OLE32. At one time, these APIs were used in both // kernel mode and user mode. They're now only used in user mode, // so all the property code has been cosolidated into ole32. Older // copies of Index Server (CI), however, still link to NTDLL, thus // the need for these forwarders. // //+============================================================================ #include //#include "propvar.h" //#include "propstm.hxx" //+---------------------------------------------------------------------------- // // Function: LoadOle32Export // // Synopsis: Load ole32.dll and get one of its exports. // Raises on error. // //+---------------------------------------------------------------------------- PVOID LoadOle32Export( PVOID* Ole32, const PCHAR ProcedureName ) { NTSTATUS Status; UNICODE_STRING Ole32DllName_U; STRING ProcedureNameString; PVOID ProcedureAddress = NULL; RtlInitUnicodeString( &Ole32DllName_U, L"ole32.dll" ); Status = LdrLoadDll( NULL, NULL, &Ole32DllName_U, Ole32 ); if( !NT_SUCCESS(Status) ) RtlRaiseStatus( Status ); RtlInitString( &ProcedureNameString, ProcedureName ); Status = LdrGetProcedureAddress( *Ole32, &ProcedureNameString, 0, (PVOID*) &ProcedureAddress ); if( !NT_SUCCESS(Status) ) RtlRaiseStatus(Status); return( ProcedureAddress ); } //+---------------------------------------------------------------------------- // // Function: RtlConvertVariantToProperty // // Synopsis: Serialize a variant. // //+---------------------------------------------------------------------------- typedef SERIALIZEDPROPERTYVALUE* (*PFNStgConvertVariantToProperty) ( IN PROPVARIANT const *pvar, IN USHORT CodePage, OUT SERIALIZEDPROPERTYVALUE *pprop, IN OUT ULONG *pcb, IN PROPID pid, IN BOOLEAN fVariantVector, OPTIONAL OUT ULONG *pcIndirect); SERIALIZEDPROPERTYVALUE * PROPSYSAPI PROPAPI RtlConvertVariantToProperty( IN PROPVARIANT const *pvar, IN USHORT CodePage, OPTIONAL OUT SERIALIZEDPROPERTYVALUE *pprop, IN OUT ULONG *pcb, IN PROPID pid, IN BOOLEAN fVariantVector, OPTIONAL OUT ULONG *pcIndirect) { NTSTATUS Status; PVOID Ole32 = NULL; PFNStgConvertVariantToProperty ProcedureAddress; SERIALIZEDPROPERTYVALUE *ppropRet; __try { ProcedureAddress = (PFNStgConvertVariantToProperty) LoadOle32Export( &Ole32, "StgConvertVariantToProperty" ); ppropRet = ProcedureAddress( pvar, CodePage, pprop, pcb, pid, fVariantVector, pcIndirect ); // Raises on error } __finally { if( NULL != Ole32 ) LdrUnloadDll( Ole32 ); } return (ppropRet ); } //+---------------------------------------------------------------------------- // // Function: RtlConvertPropertyToVariant // // Synopsis: De-serialize a variant. // //+---------------------------------------------------------------------------- typedef BOOLEAN (* PFNStgConvertPropertyToVariant) ( IN SERIALIZEDPROPERTYVALUE const *pprop, IN USHORT CodePage, OUT PROPVARIANT *pvar, IN PMemoryAllocator *pma); BOOLEAN PROPSYSAPI PROPAPI RtlConvertPropertyToVariant( IN SERIALIZEDPROPERTYVALUE const *pprop, IN USHORT CodePage, OUT PROPVARIANT *pvar, IN PMemoryAllocator *pma) { BOOLEAN Ret; NTSTATUS Status; PVOID Ole32 = NULL; STRING ProcedureName; PFNStgConvertPropertyToVariant ProcedureAddress; __try { ProcedureAddress = (PFNStgConvertPropertyToVariant) LoadOle32Export( &Ole32, "StgConvertPropertyToVariant" ); Ret = ProcedureAddress( pprop, CodePage, pvar, pma ); // Raises on error } __finally { if( NULL != Ole32 ) LdrUnloadDll( Ole32 ); } return (Ret); } //+---------------------------------------------------------------------------- // // Function: PropertyLengthAsVariant // // Synopsis: Returns the amount of external memory will need to be // allocated for this variant when RtlPropertyToVariant is called. // //+---------------------------------------------------------------------------- typedef ULONG (*PFNStgPropertyLengthAsVariant)( IN SERIALIZEDPROPERTYVALUE const *pprop, IN ULONG cbprop, IN USHORT CodePage, IN BYTE flags); ULONG PROPSYSAPI PROPAPI PropertyLengthAsVariant( IN SERIALIZEDPROPERTYVALUE const *pprop, IN ULONG cbprop, IN USHORT CodePage, IN BYTE flags) { NTSTATUS Status; ULONG Length; PVOID Ole32 = NULL; STRING ProcedureName; PFNStgPropertyLengthAsVariant ProcedureAddress; __try { ProcedureAddress = (PFNStgPropertyLengthAsVariant) LoadOle32Export( &Ole32, "StgPropertyLengthAsVariant" ); Length = ProcedureAddress( pprop, cbprop, CodePage, flags ); // Raises on error } __finally { if( NULL != Ole32 ) LdrUnloadDll( Ole32 ); } return( Length); } //+--------------------------------------------------------------------------- // // Function: RtlSetUnicodeCallouts, public // // Synopsis: Set the Unicode conversion function pointers, used by // RtlConvertVarianttoProperty, RtlConvertPropertyToVariant, // and PropertyLengthAsVariant. // // These functions are no longer settable (they're defaulted by // ole32). // //--------------------------------------------------------------------------- VOID PROPSYSAPI PROPAPI RtlSetUnicodeCallouts( IN UNICODECALLOUTS *pUnicodeCallouts) { return; }