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));
            }
        }
Example #2
0
        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));
            }
        }