unit cdorganizer; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, IBDatabase, IBCustomDataSet, IBUpdateSQL, IBQuery, ComCtrls, ExtCtrls, ToolWin, Menus, ImgList; type TForm1 = class(TForm) dbase: TIBDatabase; IBTransaction1: TIBTransaction; volupdate: TIBUpdateSQL; ListView1: TListView; TrayIcon1: TTrayIcon; MainMenu1: TMainMenu; File1: TMenuItem; Help1: TMenuItem; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; ToolButton4: TToolButton; volume: TIBDataSet; files: TIBDataSet; directories: TIBDataSet; volumeVOLUMEID: TIntegerField; volumeVOLUMENAME: TIBStringField; volumeLABELNAME: TIBStringField; volumeDRIVETYPE: TIntegerField; directoriesDIRECTORYNAME: TIBStringField; directoriesVOLUMEID: TIntegerField; directoriesDIRECTORYID: TIntegerField; filesFILEID: TIntegerField; filesFILENAME: TIBStringField; filesDIRID: TIntegerField; filesVOLUMEID: TIntegerField; filesDIRECTORYNAME: TIBStringField; ImageList1: TImageList; dirupdate: TIBUpdateSQL; fileupdate: TIBUpdateSQL; procedure FormShow(Sender: TObject); procedure volumeNewRecord(DataSet: TDataSet); private procedure onDeviceChange(var wMSG : TMessage); message WM_DeviceChange; public { Public declarations } end; const DBT_DEVICEARRIVAL = $8000; DBT_DEVICEREMOVECOMPLETE = $8004; DBTF_MEDIA = $0001; DBT_DEVTYP_VOLUME = $0002; var Form1: TForm1; implementation {$R *.dfm} type pDevBroadcast = ^DEV_BROADCAST_HDR; DEV_BROADCAST_HDR = record dbch_size : DWORD; dbch_devicetype : DWORD; dbch_reserved : DWORD; end; pDevBroadcastVolume = ^DEV_BROADCAST_VOLUME; DEV_BROADCAST_VOLUME = record dbcv_size : DWORD; dbcv_devicetype : DWORD; dbcv_reserved : DWORD; dbcv_unitmask : DWORD; dbcv_flags : WORD; end; pStorageBusType = ^STORAGE_BUS_TYPE; STORAGE_BUS_TYPE = (BusTypeUnkown, BusTypeScsi, BusTypeAtapi, BustypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb,BusTypeRAID, BusTypeMaxReserved); MEDIA_TYPE = ( Unknown, F5_1Pt2_512, F3_1Pt44_512, F3_2Pt88_512, F3_20Pt8_512, F3_720_512, F5_360_512, F5_320_512, F5_320_1024, F5_180_512, F5_160_512, RemovableMedia, FixedMedia, F3_120M_512, F3_640_512, F5_640_512, F5_720_512, F3_1Pt2_512, F3_1Pt23_1024, F5_1Pt23_1024, F3_128Mb_512, F3_230Mb_512, F8_256_128, F3_200Mb_512, F3_240M_512, F3_32M_512 ); TTapeInfo = record STORAGE_MEDIA_TYPE : MEDIA_TYPE; MediaCharacteristics : DWORD; CurrentBlockSize : DWORD; STORAGE_BUS_TYPE : STORAGE_BUS_TYPE; MediumType : BYTE; DensityCode : BYTE; end; TDiskInfo = record Cylinders : Large_Integer; STORAGE_MEDIA_TYPE : MEDIA_TYPE; TracksPerCylinder : DWORD; SectorsPerTrack : DWORD; BytesPerSector : DWORD; NumberMediasides : DWORD; MediaCharacteristics : DWORD; end; TRemoveableDiskInfo = record Cylinders : Large_Integer; Storage_Media_Type : MEDIA_TYPE; TracksPerCylinder : DWORD; SectorsPerTrack : DWORD; BytesPerSector : DWORD; NumberMediaSides : DWORD; MediaCharacteristics : DWORD; end; pDeviceMediaInfo = ^DEVICE_MEDIA_INFO; DEVICE_MEDIA_INFO = record DiskInfo : TDiskInfo; RemoveableDiskInfo : TRemoveableDiskInfo; TapeInfo : TTapeInfo; end; pGetMediaTypes = ^GET_MEDIA_TYPES; GET_MEDIA_TYPES = record DeviceType : DWORD; MediaInfoCount : DWORD; MediaInfo : DEVICE_MEDIA_INFO; end; TVolInfo = record serialNumber : String; volumeName : String; end; function getVolInfo(theDrive: String) : TVolInfo; var volumeInfo : TVolInfo; volName, sysType : PChar; MaxComLen, sysFlags, volSerNum : DWORD; begin if(getVolumeInformation(PChar(theDrive),volName,1024,@volSerNum,MaxComLen,sysFlags,sysType,1024)) then begin volumeInfo.serialNumber := IntToStr(volSerNum); volumeInfo.volumeName := volName; Result := volumeInfo; end; end; function getDrive(pDrive: PDevBroadCastVolume):String; var i : Byte; uMask:DWORD; begin if (pDrive^.dbcv_flags and DBTF_MEDIA) = DBTF_MEDIA then begin uMask := pDrive^.dbcv_unitmask; for i := 0 to 25 do begin if(uMask and 1) = 1 then Result := Char(i+Ord('A')) + ':'; uMask := uMask shr 1; end; end; end; procedure getContents(theDrive:String; theQuery:String; theFiles:TStringList; theVolume:String); var searchRec:TSearchRec; result:Integer; begin theDrive := IncludeTrailingPathDelimiter(theDrive); result := findFirst(theDrive+theQuery,faAnyFile,searchRec); while result = 0 do begin if searchRec.Attr and faDirectory = 0 then begin theFiles.Add(theDrive+searchRec.Name); // add files end else if(searchRec.Attr and faDirectory) <> 0 then begin if(searchRec.Name <> '.') and (searchRec.Name <> '..') then begin // add directory theFiles.Add(theDrive+searchRec.Name+'\'); getContents(theDrive+searchRec.Name,theQuery,theFiles,'The Volume'); end; end; result := findNext(searchRec); end; findClose(searchRec); theFiles.SaveToFile('fileList.txt'); end; procedure TForm1.FormShow(Sender: TObject); begin dbase.Open; end; procedure TForm1.onDeviceChange(var wMSG: TMessage); var theDrive, theLabel : String; theList : TStringList; volResult : TVolInfo; newDrive : TListItem; begin theList := TStringList.Create; case wMSG.WParam of DBT_DEVICEARRIVAL: if (PDevBroadcast(wMSG.LParam)^.dbch_devicetype = DBT_DEVTYP_VOLUME) then begin theDrive := getDrive(PDevBroadcastVolume(wMsg.LParam)); volResult := getVolInfo(theDrive+'\'); ShowMessage(Self.ClassName); newDrive := listview1.Items.add(); newDrive.Caption := 'test'; end; DBT_DEVICEREMOVECOMPLETE: showMessage('CD REMOVED'); end; end; procedure TForm1.volumeNewRecord(DataSet: TDataSet); begin showMessage('new record'); end; end.