Subversion Repositories recyclebinunit

Rev

Rev 100 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
75 daniel-mar 1
unit RecBinUnitLowLvl;
2
 
3
interface
4
 
5
uses
6
  Windows;
7
 
8
type
76 daniel-mar 9
  PRbInfoHeader = ^TRbInfoHeader;
99 daniel-mar 10
  TRbInfoHeader = packed record
11
    format: DWORD;         // Version of the info file
12
                           // Win95 (without IE4):   00 00 00 00
13
                           // Win NT4:               02 00 00 00   (Win96/Cairo?)
14
                           // Win95 (with IE4), 98:  04 00 00 00
15
                           // Win Me, 2000, XP:      05 00 00 00   (NT4+IE4, NT5?)
100 daniel-mar 16
    totalEntries: DWORD;   // Only Win95 (without IE4) and Win NT4, other OS versions will use the registry instead and might write information on WM_ENDSESSION for compatibility reasons
17
    nextPossibleID: DWORD; // Only Win95 (without IE4) and Win NT4, other OS versions will use the registry instead and might write information on WM_ENDSESSION for compatibility reasons
101 daniel-mar 18
    recordLength: DWORD;   // 0x118  =  ANSI records
99 daniel-mar 19
                           // 0x320  =  Unicode records
20
    totalSize: DWORD;      // sum of all "originalSize" values;
100 daniel-mar 21
                           // Only Win95 (without IE4) and Win NT4, other OS versions will use the registry instead and might write information on WM_ENDSESSION for compatibility reasons
75 daniel-mar 22
  end;
23
 
24
type
76 daniel-mar 25
  // Windows 95:      INFO file with TRbInfoRecordA; Folder deletion NOT possible
26
  // Windows 95 +IE4: INFO2 file with TRbInfoRecordA; Folder deletion possible
27
  PRbInfoRecordA = ^TRbInfoRecordA;
99 daniel-mar 28
  TRbInfoRecordA = packed record
29
    sourceAnsi: array[0..MAX_PATH-1] of AnsiChar; // 260 characters (including NUL terminator)
75 daniel-mar 30
    recordNumber: DWORD;
100 daniel-mar 31
    sourceDrive: DWORD; // 0=A, 1=B, 2=C, ..., Z=25, @=26 (@ is the "Network home drive" of the Win95 time)
75 daniel-mar 32
    deletionTime: FILETIME;
33
    originalSize: DWORD; // Size occupied on disk. Not the actual file size.
76 daniel-mar 34
                         // INFO2, for folders: The whole folder size with contents
75 daniel-mar 35
  end;
36
 
37
type
76 daniel-mar 38
  // Windows NT4:   INFO file with TRbInfoRecordW; Folder deletion possible
39
  // Windows 2000+: INFO2 file with TRbInfoRecordW; Folder deletion possible
40
  PRbInfoRecordW = ^TRbInfoRecordW;
99 daniel-mar 41
  TRbInfoRecordW = packed record
42
    sourceAnsi: array[0..MAX_PATH-1] of AnsiChar; // 260 characters (including NUL terminator)
75 daniel-mar 43
    recordNumber: DWORD;
100 daniel-mar 44
    sourceDrive: DWORD; // 0=A, 1=B, 2=C, ..., Z=25, @=26 (@ is the "Network home drive" of the Win95 times)
75 daniel-mar 45
    deletionTime: FILETIME;
46
    originalSize: DWORD;
99 daniel-mar 47
    sourceUnicode: array[0..MAX_PATH-1] of WideChar; // 260 characters (including NUL terminator)
75 daniel-mar 48
  end;
49
 
50
type
90 daniel-mar 51
  // Introduced in Windows Vista
82 daniel-mar 52
  PRbVistaRecord1 = ^TRbVistaRecord1;
99 daniel-mar 53
  TRbVistaRecord1 = packed record
82 daniel-mar 54
    version: int64; // Always 01 00 00 00 00 00 00 00
75 daniel-mar 55
    originalSize: int64;
56
    deletionTime: FILETIME;
57
    sourceUnicode: array[0..MAX_PATH-1] of WideChar;
58
  end;
59
 
60
type
90 daniel-mar 61
  // Introduced somewhere in a Win10 release
82 daniel-mar 62
  PRbVistaRecord2Head = ^TRbVistaRecord2Head;
99 daniel-mar 63
  TRbVistaRecord2Head = packed record
82 daniel-mar 64
    version: int64; // Always 02 00 00 00 00 00 00 00
65
    originalSize: int64;
66
    deletionTime: FILETIME;
67
    sourceCountChars: DWORD; // including NUL
100 daniel-mar 68
    //sourceUnicode: array[0..sourceCountChars-1] of WideChar;
82 daniel-mar 69
  end;
70
 
71
type
101 daniel-mar 72
  // Windows 95 (tested with 4.00.180 and above) + Windows NT 4
75 daniel-mar 73
  // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\BitBucket: PurgeInfo (Binary)
100 daniel-mar 74
  // TODO: also explain this in FORMAT.md ?
76 daniel-mar 75
  PRbWin95PurgeInfo = ^TRbWin95PurgeInfo;
99 daniel-mar 76
  TRbWin95PurgeInfo = packed record
100 daniel-mar 77
    cbSize: DWORD; // 0x48 = 72
75 daniel-mar 78
    bGlobalSettings: BOOL;
79
    percentDrive: array['A'..'Z'] of WORD; // 0x00..0x64 = 0%..100%
80
    percentHomedrive: WORD;
81
    percentGlobal: WORD;
82
    NukeOnDeleteBits: DWORD; // Flags "Nuke on delete"
83
                             // Bit 0 (LSB): Drive A
84
                             // Bit 1: Drive B
85
                             // ...
86
                             // Bit 25: Drive Z
100 daniel-mar 87
                             // Bit 26: "Network home drive"
75 daniel-mar 88
                             // Bit 27: Global
100 daniel-mar 89
                             // Bit 28..31 (MSB) unused
101 daniel-mar 90
    dummy: DWORD; // "dummy to force a new size" ?! But the 0x48 format was already in Win95 beta build 180, which is the first known build with this recycle bin implementation!
100 daniel-mar 91
  end;
75 daniel-mar 92
 
93
implementation
94
 
95
end.