| $dllfile = gi unrar64.dll -ea stop |
| |
| Add-Type -Type @" |
| using System; |
| using System.Runtime.InteropServices; |
| |
| namespace PS |
| { |
| public class Unrar |
| { |
| [StructLayout(LayoutKind.Sequential)] |
| public struct RAROpenArchiveDataEx |
| { |
| [MarshalAs(UnmanagedType.LPStr)] |
| public string ArcName; |
| |
| [MarshalAs(UnmanagedType.LPWStr)] |
| public string ArcNameW; |
| |
| public uint OpenMode; |
| public uint OpenResult; |
| |
| [MarshalAs(UnmanagedType.LPStr)] |
| public string CmtBuf; |
| |
| public uint CmtBufSize; |
| public uint CmtSize; |
| public uint CmtState; |
| public uint Flags; |
| |
| public UNRARCallback Callback; |
| public uint UserData; |
| |
| [MarshalAs(UnmanagedType.ByValArray, SizeConst = 28)] |
| public uint[] Reserved; |
| |
| } |
| |
| |
| [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] |
| public struct RARHeaderDataEx |
| { |
| [MarshalAs(UnmanagedType.ByValTStr, SizeConst=512)] |
| public string ArcName; |
| |
| [MarshalAs(UnmanagedType.ByValTStr, SizeConst=1024)] |
| public string ArcNameW; |
| |
| [MarshalAs(UnmanagedType.ByValTStr, SizeConst=512)] |
| public string FileName; |
| |
| [MarshalAs(UnmanagedType.ByValTStr, SizeConst=1024)] |
| public string FileNameW; |
| |
| public uint Flags; |
| public uint PackSize; |
| public uint PackSizeHigh; |
| public uint UnpSize; |
| public uint UnpSizeHigh; |
| public uint HostOS; |
| public uint FileCRC; |
| public uint FileTime; |
| public uint UnpVer; |
| public uint Method; |
| public uint FileAttr; |
| |
| [MarshalAs(UnmanagedType.LPStr)] |
| public string CmtBuf; |
| |
| public uint CmtBufSize; |
| public uint CmtSize; |
| public uint CmtState; |
| |
| public uint DictSize; |
| public uint HashType; |
| |
| [MarshalAs(UnmanagedType.ByValTStr, SizeConst=16)] |
| public string Hash; |
| |
| public uint RedirType; |
| |
| [MarshalAs(UnmanagedType.LPWStr)] |
| public string RedirName; |
| |
| public uint RedirNameSize; |
| public uint DirTarget; |
| |
| [MarshalAs(UnmanagedType.ByValArray, SizeConst=994)] |
| public uint[] Reserved; |
| } |
| |
| public delegate int UNRARCallback(uint msg, int UserData, IntPtr p1, int p2); |
| |
| //============================================================================================ |
| |
| [DllImport(@"$dllfile")] |
| public static extern IntPtr RAROpenArchiveEx(ref RAROpenArchiveDataEx archiveData); |
| |
| [DllImport(@"$dllfile")] |
| public static extern int RARCloseArchive(IntPtr hArcData); |
| |
| [DllImport(@"$dllfile")] |
| public static extern int RARReadHeaderEx(IntPtr hArcData, ref RARHeaderDataEx headerData); |
| |
| [DllImport(@"$dllfile")] |
| public static extern int RARProcessFileW(IntPtr hArcData, int operation, |
| [MarshalAs(UnmanagedType.LPWStr)] string destPath, |
| [MarshalAs(UnmanagedType.LPWStr)] string destName ); |
| |
| } |
| } |
| |
| "@ |
| |
| |
| $sb={ |
| param( [uint32]$msg, |
| [int32]$UserData, |
| [IntPtr]$p1, |
| [int32]$p2 |
| ) |
| |
| switch ($msg) |
| { |
| 1{ |
| [System.Runtime.InteropServices.Marshal]::Copy($p1,$buffer,$bufferPos,$p2) |
| $script:bufferPos+=$p2 |
| return 1 |
| } |
| |
| 3{ |
| $fn = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($p1) |
| if ($p2 -eq 0) {write-host "沒找到 $fn";return -1} |
| if ($p2 -eq 1) {write-host "找到 $fn";return 1} |
| } |
| |
| 4{ |
| $pass = read-host '請輸入密碼' |
| $pass = [System.Text.Encoding]::Unicode.GetBytes($pass) |
| [System.Runtime.InteropServices.Marshal]::Copy($pass,0,$p1,$pass.length) |
| return 1 |
| } |
| } |
| } |
| |
| [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms") |
| |
| $form = new-object Windows.Forms.Form |
| $form.FormBorderStyle = [Windows.Forms.FormBorderStyle]::None |
| $form.WindowState=[Windows.Forms.FormWindowState]::Maximized |
| |
| |
| $pictureBox = new-object Windows.Forms.PictureBox |
| $pictureBox.Dock="Fill" |
| $pictureBox.SizeMode = [Windows.Forms.PictureBoxSizeMode]::Zoom |
| |
| $form.controls.add($pictureBox) |
| $form.Add_Shown( { $form.Activate() } ) |
| |
| $file = @(dir *.rar)[0] |
| if ($file -eq $null) {write-host '沒找到 rar';pause;exit} |
| |
| |
| $open=new-object PS.Unrar+RAROpenArchiveDataEx |
| $open.ArcNameW=$file |
| $open.OpenMode=1 |
| $open.Reserved=@(0)*28 |
| $open.Callback=$sb |
| |
| |
| $handle=[PS.Unrar]::RAROpenArchiveEx([ref]$open) |
| if ( $open.OpenResult){write-host 'ERROR open';pause;exit} |
| |
| |
| $nextP={ |
| |
| $header = new-object PS.Unrar+RARHeaderDataEx |
| |
| while ($true) { |
| $result = [PS.Unrar]::RARReadHeaderEx($handle,[ref]$header) |
| |
| if ( $result ){[PS.Unrar]::RARCloseArchive($handle);stop-process -Id $PID} |
| |
| |
| if ($header.FileNameW -match '\.(jpg|png|bmp)$') { break} else { |
| [PS.Unrar]::RARProcessFileW($handle,0,$null,$null)} |
| |
| } |
| |
| |
| |
| $script:buffer=new-object byte[]($header.UnpSize) |
| $script:bufferPos=0 |
| $result=[PS.Unrar]::RARProcessFileW($handle,1,$null,$null) |
| |
| |
| if ( $result ){[PS.Unrar]::RARCloseArchive($handle);stop-process -Id $PID} |
| |
| |
| $ms=new-object IO.MemoryStream($buffer,0,$buffer.length) |
| $img = [System.Drawing.Image]::FromStream($ms) |
| $pictureBox.Image = $img |
| $ms.close() |
| |
| } |
| |
| |
| $pictureBox.Add_Click($nextP) |
| |
| & $nextP |
| |
| [void]$form.ShowDialog()COPY |