Ejemplo n.º 1
0
        private static unsafe void RunFunctionWithConservativelyReportedBufferInternal <T>(int cbBuffer, IntPtr pfnTargetToInvoke, ref T context, ref RuntimeImports.ConservativelyReportedRegionDesc regionDesc)
        {
            fixed(RuntimeImports.ConservativelyReportedRegionDesc *pRegionDesc = &regionDesc)
            {
                int cbBufferAligned = (cbBuffer + (sizeof(IntPtr) - 1)) & ~(sizeof(IntPtr) - 1);
                // The conservative region must be IntPtr aligned, and a multiple of IntPtr in size
                void *region = stackalloc IntPtr[cbBufferAligned / sizeof(IntPtr)];

                RuntimeImports.RhInitializeConservativeReportingRegion(pRegionDesc, region, cbBufferAligned);

                RawCalliHelper.Call <T>(pfnTargetToInvoke, region, ref context);

                RuntimeImports.RhDisableConservativeReportingRegion(pRegionDesc);
            }
        }