internal static SafeStringResource ReadSafeStringResource(Type t) { // Module.FullyQualifiedName was changed to check for FileIOPermission regardless of the name being an existing file or not. // we need to Assert in order to succeed the Demand() (ASURT 121603) (InternalSecurityPermissions.PathDiscovery(HttpRuntime.CodegenDirInternal)).Assert(); string dllPath = t.Module.FullyQualifiedName; IntPtr hModule = UnsafeNativeMethods.GetModuleHandle(dllPath); if (hModule == (IntPtr)0) { throw new HttpException(HttpRuntime.FormatResourceString(SR.Resource_problem, "GetModuleHandle", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString())); } IntPtr hrsrc = UnsafeNativeMethods.FindResource(hModule, (IntPtr)RESOURCE_ID, (IntPtr)RESOURCE_TYPE); if (hrsrc == (IntPtr)0) { throw new HttpException(HttpRuntime.FormatResourceString(SR.Resource_problem, "FindResource", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString())); } int resSize = UnsafeNativeMethods.SizeofResource(hModule, hrsrc); IntPtr hglob = UnsafeNativeMethods.LoadResource(hModule, hrsrc); if (hglob == (IntPtr)0) { throw new HttpException(HttpRuntime.FormatResourceString(SR.Resource_problem, "LoadResource", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString())); } IntPtr pv = UnsafeNativeMethods.LockResource(hglob); if (pv == (IntPtr)0) { throw new HttpException(HttpRuntime.FormatResourceString(SR.Resource_problem, "LockResource", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString())); } // Make sure the end of the resource lies within the module. this can be an issue // if the resource has been hacked with an invalid length (ASURT 145040) if (!UnsafeNativeMethods.IsValidResource(hModule, pv, resSize)) { throw new InvalidOperationException(); } return(new SafeStringResource(pv, resSize)); }
internal static SafeStringResource ReadSafeStringResource(Type t) { if (HttpRuntime.CodegenDirInternal != null) { InternalSecurityPermissions.PathDiscovery(HttpRuntime.CodegenDirInternal).Assert(); } IntPtr moduleHandle = UnsafeNativeMethods.GetModuleHandle(t.Module.FullyQualifiedName); if (moduleHandle == IntPtr.Zero) { moduleHandle = Marshal.GetHINSTANCE(t.Module); if (moduleHandle == IntPtr.Zero) { throw new HttpException(System.Web.SR.GetString("Resource_problem", new object[] { "GetModuleHandle", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString(CultureInfo.InvariantCulture) })); } } IntPtr hResInfo = UnsafeNativeMethods.FindResource(moduleHandle, (IntPtr)0x65, (IntPtr)0xebb); if (hResInfo == IntPtr.Zero) { throw new HttpException(System.Web.SR.GetString("Resource_problem", new object[] { "FindResource", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString(CultureInfo.InvariantCulture) })); } int size = UnsafeNativeMethods.SizeofResource(moduleHandle, hResInfo); IntPtr hResData = UnsafeNativeMethods.LoadResource(moduleHandle, hResInfo); if (hResData == IntPtr.Zero) { throw new HttpException(System.Web.SR.GetString("Resource_problem", new object[] { "LoadResource", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString(CultureInfo.InvariantCulture) })); } IntPtr ip = UnsafeNativeMethods.LockResource(hResData); if (ip == IntPtr.Zero) { throw new HttpException(System.Web.SR.GetString("Resource_problem", new object[] { "LockResource", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString(CultureInfo.InvariantCulture) })); } if (!UnsafeNativeMethods.IsValidResource(moduleHandle, ip, size)) { throw new InvalidOperationException(); } return(new SafeStringResource(ip, size)); }
internal static SafeStringResource ReadSafeStringResource(Type t) { // At designtime CodeGenDir is null. if (HttpRuntime.CodegenDirInternal != null) { // Module.FullyQualifiedName was changed to check for FileIOPermission regardless of the name being an existing file or not. // we need to Assert in order to succeed the Demand() (ASURT 121603) (InternalSecurityPermissions.PathDiscovery(HttpRuntime.CodegenDirInternal)).Assert(); } string dllPath = t.Module.FullyQualifiedName; IntPtr hModule = UnsafeNativeMethods.GetModuleHandle(dllPath); if (hModule == IntPtr.Zero) { // GetModuleHandle could fail if the assembly was renamed to .delete. So we fall back to // calling Marshal.GetHINSTANCE, which is more reliable. Ideally, we should always do this // directly, but to limit the risk, we only do it as a fall back (VSWhidbey 394621) hModule = Marshal.GetHINSTANCE(t.Module); if (hModule == IntPtr.Zero) { throw new HttpException(SR.GetString(SR.Resource_problem, "GetModuleHandle", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString(CultureInfo.InvariantCulture))); } } IntPtr hrsrc = UnsafeNativeMethods.FindResource(hModule, (IntPtr)RESOURCE_ID, (IntPtr)RESOURCE_TYPE); if (hrsrc == IntPtr.Zero) { throw new HttpException(SR.GetString(SR.Resource_problem, "FindResource", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString(CultureInfo.InvariantCulture))); } int resSize = UnsafeNativeMethods.SizeofResource(hModule, hrsrc); IntPtr hglob = UnsafeNativeMethods.LoadResource(hModule, hrsrc); if (hglob == IntPtr.Zero) { throw new HttpException(SR.GetString(SR.Resource_problem, "LoadResource", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString(CultureInfo.InvariantCulture))); } IntPtr pv = UnsafeNativeMethods.LockResource(hglob); if (pv == IntPtr.Zero) { throw new HttpException(SR.GetString(SR.Resource_problem, "LockResource", HttpException.HResultFromLastError(Marshal.GetLastWin32Error()).ToString(CultureInfo.InvariantCulture))); } // Make sure the end of the resource lies within the module. this can be an issue // if the resource has been hacked with an invalid length (ASURT 145040) if (!UnsafeNativeMethods.IsValidResource(hModule, pv, resSize)) { throw new InvalidOperationException(); } return(new SafeStringResource(pv, resSize)); }