internal static IntPtr FdiOpen(string filename, int oflag, int pmode) { FileMode mode = CabinetNativeApi.ConvertOpflagToFileMode(oflag); FileAccess access = CabinetNativeApi.ConvertPermissionModeToFileAccess(pmode); FileShare share = CabinetNativeApi.ConvertPermissionModeToFileShare(pmode); // This method is used for opening the cab file as well as saving the extracted files. // When we are opening the cab file we only need read permissions. // We force read permissions so that non-elevated users can extract cab files. if (mode == FileMode.Open || mode == FileMode.OpenOrCreate) { access = FileAccess.Read; share = FileShare.Read; } try { FileStream stream = new FileStream(filename, mode, access, share); if (stream is null) { return(new IntPtr(-1)); } return(GCHandle.ToIntPtr(GCHandle.Alloc(stream))); } catch (IOException) { return(new IntPtr(-1)); } }
internal static IntPtr FdiOpen(string filename, int oflag, int pmode) { FileMode mode = CabinetNativeApi.ConvertOpflagToFileMode(oflag); FileAccess access = CabinetNativeApi.ConvertPermissionModeToFileAccess(pmode); FileShare share = CabinetNativeApi.ConvertPermissionModeToFileShare(pmode); try { FileStream stream = new FileStream(filename, mode, access, share); if (null == stream) { return(new IntPtr(-1)); } return(GCHandle.ToIntPtr(GCHandle.Alloc(stream))); } catch (IOException) { return(new IntPtr(-1)); } }