CovertFuncs.pas
上传用户:wanyu_2000
上传日期:2021-02-21
资源大小:527k
文件大小:20k
源码类别:

DVD

开发平台:

Delphi

  1. {$WARN SYMBOL_DEPRECATED OFF}
  2. {$WARN SYMBOL_PLATFORM OFF}
  3. {-----------------------------------------------------------------------------
  4.  Unit Name: CovertFuncs
  5.  Author:    Dancemammal
  6.  Purpose:   Standard Functions
  7.  History:
  8. -----------------------------------------------------------------------------}
  9. unit CovertFuncs;
  10. interface
  11. uses Windows, SysUtils, Classes, DeviceTypes, Math, TypInfo, ScsiDefs,
  12. scsitypes;
  13. const
  14.   OS_UNKNOWN = -1;
  15.   OS_WIN95 = 0;
  16.   OS_WIN98 = 1;
  17.   OS_WINNT35 = 2;
  18.   OS_WINNT4 = 3;
  19.   OS_WIN2K = 4;
  20.   OS_WINXP = 5;
  21.   SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
  22.   SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  23.   DOMAIN_ALIAS_RID_ADMINS = $00000220;
  24. type
  25.   TCharArr = array of Char;
  26. type
  27.   TBothEndianWord = packed record
  28.     LittleEndian,
  29.       BigEndian: Word;
  30.   end;
  31.   TBothEndianDWord = packed record
  32.     LittleEndian,
  33.       BigEndian: LongWord;
  34.   end;
  35. type
  36.   TVolumeDateTime = packed record
  37.     Year: array[0..3] of Char;
  38.     Month: array[0..1] of Char;
  39.     Day: array[0..1] of Char;
  40.     Hour: array[0..1] of Char;
  41.     Minute: array[0..1] of Char;
  42.     Second: array[0..1] of Char;
  43.     MSeconds: array[0..1] of Char;
  44.     GMTOffset: Byte;
  45.   end;
  46. type
  47.   TDirectoryDateTime = packed record
  48.     Year: Byte; // since 1900
  49.     Month: Byte;
  50.     Day: Byte;
  51.     Hour: Byte;
  52.     Minute: Byte;
  53.     Second: Byte;
  54.     GMTOffset: Byte; // in 15 minutes steps
  55.   end;
  56. function EnumToStr(ArgType: PTypeInfo; var Arg): string;
  57. function SetToStr(ArgType: PTypeInfo; var Arg): string;
  58. function HexToStrings(Buf: pointer; BufLen: DWORD): TStrings;
  59. function Swap32(value: dword): dword;
  60. function ConvertDataBlock(DataBlock: Integer): Integer;
  61. function GetFileSize(const FileName: string): LongInt;
  62. procedure ZeroMemory(Destination: Pointer; Length: DWORD);
  63. function getOsVersion: integer;
  64. function RoundUp(X: Extended): Integer;
  65. function ArrOfChar(AStr: string): TCharArr;
  66. function IntToMB(const ASize: Int64): string;
  67. function VolumeDateTimeToStr(const VDT: TVolumeDateTime): string;
  68. function SwapWord(const AValue: Word): Word;
  69. function SwapDWord(const AValue: LongWord): LongWord;
  70. function BuildBothEndianWord(const AValue: Word): TBothEndianWord;
  71. function BuildBothEndianDWord(const AValue: LongWord): TBothEndianDWord;
  72. function BuildDirectoryDateTime(const ADateTime: TDateTime; const AGMTOffset:
  73.   Byte): TDirectoryDateTime;
  74. function BuildVolumeDateTime(const ADateTime: TDateTime; const AGMTOffset:
  75.   Byte): TVolumeDateTime;
  76. function RetrieveFileSize(const AFileName: string): LongWord;
  77. function IsAdministrator: Boolean;
  78. function Endian(const Source; var Destination; const Count: Integer): Boolean;
  79. function EndianToIntelBytes(const AValue: array of Byte; Count: Byte): Integer;
  80. procedure ConvertEndians(const Src; var Dest; Count : integer);
  81. function GetLBA(const Byte1, Byte2, Byte3, Byte4: Byte): LongWord;
  82. function HMSFtoLBA(const AHour, AMinute, ASecond, AFrame: Byte): LongWord;
  83. function LBA2HMSF(LBA: Integer): string;
  84. Procedure LBA2MSF(Const LBA: Integer; Var Min, Sec, Frame :Integer);
  85. function LBA2MB(LBA, BlockSize: DWord): DWord;
  86. function LBA2PreCDDB(LBA: Integer): Integer;
  87. function SectorPos2TimePos(SectorPos : longint) : longint;
  88. function TimePos2SectorPos(Min, Sec, Frame : longint) : longint;
  89. function HiWord(Lx: LongWord): Word;
  90. function LoWord(Lx: LongWord): Word;
  91. function HiByte(Lx: Word): Byte;
  92. function LoByte(Lx: Word): Byte;
  93. function IsBitSet(const Value: LongWord; const Bit: Byte): Boolean;
  94. function BitOn(const Value: LongWord; const Bit: Byte): LongWord;
  95. function BitOff(const Value: LongWord; const Bit: Byte): LongWord;
  96. function BitToggle(const Value: LongWord; const Bit: Byte): LongWord;
  97. function ByteToBin(Value: Byte): string;
  98. function ScsiErrToString(Err: TScsiError): string;
  99. function UnicodeToStr(Name: string): String;
  100. function StrToUnicode(Name: string): PWideChar;
  101. function DOSchars_Len(str: string; Sze: integer): string;
  102. function GetISOFilename(const FileName: string): string;
  103. function BigEndianW(Arg: WORD): WORD;
  104. function BigEndianD(Arg: DWORD): DWORD;
  105. procedure BigEndian(const Source; var Dest; Count: integer);
  106. function GatherWORD(b1, b0: byte): WORD;
  107. function GatherDWORD(b3, b2, b1, b0: byte): DWORD;
  108. procedure ScatterDWORD(Arg: DWORD; var b3, b2, b1, b0: byte);
  109. procedure ASPIstrCopy(Src: PChar; var Dst: ShortString; Leng: Integer);
  110. function CDDB_Sum(N: Integer): Integer;
  111. implementation
  112. function getOsVersion: integer;
  113. var
  114.   os: OSVERSIONINFO;
  115. begin
  116.   ZeroMemory(@os, sizeof(os));
  117.   os.dwOSVersionInfoSize := sizeof(os);
  118.   GetVersionEx(os);
  119.   if os.dwPlatformId = VER_PLATFORM_WIN32_NT then
  120.   begin
  121.     if (os.dwMajorVersion = 3) and (os.dwMinorVersion >= 51) then
  122.     begin
  123.       Result := OS_WINNT35;
  124.       Exit;
  125.     end
  126.     else if os.dwMajorVersion = 4 then
  127.     begin
  128.       Result := OS_WINNT4;
  129.       Exit;
  130.     end
  131.     else if (os.dwMajorVersion = 5) and (os.dwMinorVersion = 0) then
  132.     begin
  133.       Result := OS_WIN2K;
  134.       Exit;
  135.     end
  136.     else
  137.     begin
  138.       Result := OS_WINXP;
  139.       Exit;
  140.     end;
  141.   end
  142.   else if os.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then
  143.   begin
  144.     if os.dwMinorVersion = 0 then
  145.     begin
  146.       Result := OS_WIN95;
  147.       Exit;
  148.     end
  149.     else
  150.     begin
  151.       Result := OS_WIN98;
  152.       Exit;
  153.     end;
  154.   end;
  155.   Result := OS_UNKNOWN;
  156. end;
  157. function BigEndianW(Arg: WORD): WORD;
  158. begin
  159.   result := ((Arg shl 8) and $FF00) or
  160.     ((Arg shr 8) and $00FF);
  161. end;
  162. function BigEndianD(Arg: DWORD): DWORD;
  163. begin
  164.   result := ((Arg shl 24) and $FF000000) or
  165.     ((Arg shl 8) and $00FF0000) or
  166.     ((Arg shr 8) and $0000FF00) or
  167.     ((Arg shr 24) and $000000FF);
  168. end;
  169. procedure BigEndian(const Source; var Dest; Count: integer);
  170. var
  171.   pSrc, pDst: PChar;
  172.   i: integer;
  173. begin
  174.   pSrc := @Source;
  175.   pDst := PChar(@Dest) + Count;
  176.   for i := 0 to Count - 1 do
  177.   begin
  178.     Dec(pDst);
  179.     pDst^ := pSrc^;
  180.     Inc(pSrc);
  181.   end;
  182. end;
  183. function GatherWORD(b1, b0: byte): WORD;
  184. begin
  185.   result := ((WORD(b1) shl 8) and $FF00) or
  186.     ((WORD(b0)) and $00FF);
  187. end;
  188. {$WARNINGS OFF}
  189. function GatherDWORD(b3, b2, b1, b0: byte): DWORD;
  190. begin
  191.   result := ((LongInt(b3) shl 24) and $FF000000) or
  192.     ((LongInt(b2) shl 16) and $00FF0000) or
  193.     ((LongInt(b1) shl 8) and $0000FF00) or
  194.     ((LongInt(b0)) and $000000FF);
  195. end;
  196. {$WARNINGS ON}
  197. procedure ScatterDWORD(Arg: DWORD; var b3, b2, b1, b0: byte);
  198. begin
  199.   b3 := (Arg shr 24) and $FF;
  200.   b2 := (Arg shr 16) and $FF;
  201.   b1 := (Arg shr 8) and $FF;
  202.   b0 := Arg and $FF;
  203. end;
  204. procedure ASPIstrCopy(Src: PChar; var Dst: ShortString; Leng: Integer);
  205. var
  206.   i: integer;
  207. begin
  208.   i := 0;
  209.   while (i < Leng) and (Src[i] >= ' ') do
  210.   begin
  211.     Dst[i + 1] := Src[i];
  212.     inc(i);
  213.   end;
  214.   while (i > 0) and (Dst[i] = ' ') do
  215.     Dec(i); // Trim it Right
  216.   Dst[0] := CHR(i);
  217. end;
  218. function Swap32(value: dword): dword;
  219.   assembler;
  220. asm
  221.    bswap eax
  222. end;
  223. function UnicodeToStr(Name: string): String;
  224. var
  225.   i: integer;
  226.   ResString : String;
  227. begin
  228.   ResString := '';
  229.   For I := 0 to length(Name) do
  230.      if Name[i] <> #0 then ResString := ResString + Name[i];
  231.   Result := ResString;
  232. end;
  233. function StrToUnicode(Name: string): PWideChar;
  234. var
  235.   WideChr: PWideChar;
  236.   Size: Integer;
  237. begin
  238.   Size := (length(Name) + 1) * 2;
  239.   WideChr := PWideChar(StrAlloc(Size)); //important
  240.   StringToWideChar(Name, WideChr, Size + 1);
  241.   Result := WideChr;
  242. end;
  243. function DOSchars_Len(str: string; Sze: integer): string;
  244. //filters out non DOS chars, max length = Sze, including extension
  245. var
  246.   temp: string;
  247.   i: integer;
  248. begin
  249.   result := ''; //important
  250.   temp := UpperCase(str);
  251.   if Pos('.', temp) > 0 then
  252.   begin
  253.     result := DOSchars_Len(Copy(temp, 1, Pos('.', temp) - 1), Sze - 4) +
  254.       Copy(temp, Pos('.', temp), 4);
  255.     exit;
  256.   end;
  257.   for i := 1 to length(temp) do
  258.     if temp[i] in ['0'..'9', 'A'..'Z', '_'] then
  259.       result := result + temp[i];
  260.   result := Copy(result, 1, Sze);
  261. end;
  262. procedure ZeroMemory(Destination: Pointer; Length: DWORD);
  263. begin
  264.   FillChar(Destination^, Length, 0);
  265. end;
  266. function EnumToStr(ArgType: PTypeInfo; var Arg): string;
  267. begin
  268.   case (GetTypeData(ArgType))^.OrdType of
  269.     otSByte, otUByte: Result := GetEnumName(ArgType, BYTE(Arg));
  270.     otSWord, otUWord: Result := GetEnumName(ArgType, WORD(Arg));
  271.     otSLong: Result := GetEnumName(ArgType, LongInt(Arg));
  272.   end;
  273. end;
  274. function ScsiErrToString(Err: TScsiError): string;
  275. begin
  276.   Result := EnumToStr(TypeInfo(TScsiError), Err);
  277. end;
  278. type
  279.   TIntegerSet = set of 0..SizeOf(Integer) * 8 - 1;
  280.   PIntegerSet = ^TIntegerSet;
  281. function SetToStr(ArgType: PTypeInfo; var Arg): string;
  282. var
  283.   Info: PTypeInfo;
  284.   Data: PTypeData;
  285.   I: Integer;
  286. begin
  287.   Result := '[';
  288.   Info := (GetTypeData(ArgType))^.CompType^;
  289.   Data := GetTypeData(Info);
  290.   for I := Data^.MinValue to Data^.MaxValue do
  291.     if I in PIntegerSet(@Arg)^ then
  292.     begin
  293.       if Length(Result) <> 1 then
  294.         Result := Result + ', ';
  295.       Result := Result + GetEnumName(Info, I);
  296.     end;
  297.   Result := Result + ']';
  298. end;
  299. {$WARNINGS OFF}
  300. function HexToStrings(Buf: pointer; BufLen: DWORD): TStrings;
  301. const
  302.   BytesPerLine = 16;
  303.   BytesPerTab = 4;
  304.   CharsInAddress = 4;
  305. var
  306.   CurLine, CurByte, CurOffset: integer;
  307.   s: string;
  308.   b: char;
  309. begin
  310.   Result := TStringList.Create;
  311.   if (BufLen <= 0) or not Assigned(Buf) then
  312.     exit;
  313.   try
  314.     for CurLine := 0 to (BufLen - 1) div BytesPerLine do
  315.     begin
  316.       CurOffset := CurLine * BytesPerLine;
  317.       s := IntToHex(CurOffset, CharsInAddress);
  318.       for CurByte := 0 to BytesPerLine - 1 do
  319.       begin
  320.         if (CurByte mod BytesPerTab) = 0 then
  321.           s := s + ' ';
  322.         if CurOffset < BufLen then
  323.           s := s + IntToHex(BYTE((PChar(Buf) + CurOffset)^), 2) + ' '
  324.         else
  325.           s := s + '   ';
  326.         Inc(CurOffset);
  327.       end;
  328.       s := s + '|';
  329.       CurOffset := CurLine * BytesPerLine;
  330.       for CurByte := 0 to BytesPerLine - 1 do
  331.       begin
  332.         if CurOffset < BufLen then
  333.         begin
  334.           b := (PChar(Buf) + CurOffset)^;
  335.           if b < ' ' then
  336.             b := ' ';
  337.           s := s + b;
  338.         end
  339.         else
  340.           s := s + ' ';
  341.         Inc(CurOffset);
  342.       end;
  343.       Result.Add(s);
  344.     end;
  345.   except
  346.     Result.Clear;
  347.   end;
  348. end;
  349. {$WARNINGS ON}
  350. function LBA2MB(LBA, BlockSize: DWord): DWord;
  351. begin
  352.   Result := ((LBA div 1024) * BlockSize) div 1024;
  353. end;
  354. function ConvertDataBlock(DataBlock: Integer): Integer;
  355. var
  356.   DataSize: Integer;
  357. begin
  358.   DataSize := 2048;
  359.   case DataBlock of
  360.     $00: DataSize := 2352;
  361.     $01: DataSize := 2368;
  362.     $02: DataSize := 2448;
  363.     $03: DataSize := 2448;
  364.     $08: DataSize := 2048;
  365.     $09: DataSize := 2336;
  366.     $0A: DataSize := 2048;
  367.     $0B: DataSize := 2056;
  368.     $0C: DataSize := 2324;
  369.     $0D: DataSize := 2324;
  370.   end;
  371.   result := DataSize;
  372. end;
  373. {   btRAW_DATA_BLOCK = $00,
  374.     btRAW_DATA_P_Q_SUB = $01,
  375.     btRAW_DATA_P_W_SUB = $02,
  376.     btRAW_DATA_P_W_SUB2 = $03,
  377.     btMODE_1 = $08,
  378.     btMODE_2 = $09,
  379.     btMODE_2_XA_FORM_1 = $0A,
  380.     btMODE_2_XA_FORM_1_SUB = $0B,
  381.     btMODE_2_XA_FORM_2 = $0C,
  382.     btMODE_2_XA_FORM_2_SUB = $0D }
  383. function GetFileSize(const FileName: string): LongInt;
  384. var
  385.   SearchRec: TSearchRec;
  386. begin
  387.   try
  388.     if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
  389.     begin
  390.       Result := SearchRec.Size;
  391.     end
  392.     else
  393.       Result := -1;
  394.   finally
  395.     SysUtils.FindClose(SearchRec);
  396.   end;
  397. end;
  398. function IntToMB(const ASize: Int64): string;
  399. begin
  400.   Result := IntToStr(ASize div 1024 div 1024);
  401. end;
  402. function VolumeDateTimeToStr(const VDT: TVolumeDateTime): string;
  403. begin
  404.   Result := string(VDT.Day) + '.' + string(VDT.Month) + '.' +
  405.     string(VDT.Year) + ' ' + string(VDT.Hour) + ':' +
  406.     string(VDT.Minute) + ':' + string(VDT.Second) + '.' +
  407.     string(VDT.MSeconds) + ' ' + IntToStr(VDT.GMTOffset * 15) + ' min from GMT';
  408. end;
  409. procedure ConvertEndians(const Src; var Dest; Count : integer);
  410. var
  411.   pSrc,
  412.   pDst: PChar;
  413.   i : integer;
  414. begin
  415.   pSrc := @Src;
  416.   pDst := PChar(@Dest) + Count;
  417.   for i := 0 to Count-1 do begin
  418.     Dec(pDst);
  419.     pDst^ := pSrc^;
  420.     Inc(pSrc);
  421.   end;
  422. end;
  423. function ArrOfChar(AStr: string): TCharArr;
  424. var
  425.   j: integer;
  426. begin
  427.   SetLength(Result, Length(AStr));
  428.   for j := 0 to Length(AStr) - 1 do
  429.     Result[j] := AStr[j + 1];
  430. end;
  431. function SwapWord(const AValue: Word): Word;
  432. begin
  433.   Result := ((AValue shl 8) and $FF00) or ((AValue shr 8) and $00FF);
  434. end;
  435. function SwapDWord(const AValue: LongWord): LongWord;
  436. begin
  437.   Result := ((AValue shl 24) and $FF000000) or
  438.     ((AValue shl 8) and $00FF0000) or
  439.     ((AValue shr 8) and $0000FF00) or
  440.     ((AValue shr 24) and $000000FF);
  441. end;
  442. function BuildBothEndianWord(const AValue: Word): TBothEndianWord;
  443. begin
  444.   Result.LittleEndian := AValue;
  445.   Result.BigEndian := SwapWord(AValue);
  446. end;
  447. function BuildBothEndianDWord(const AValue: LongWord): TBothEndianDWord;
  448. begin
  449.   Result.LittleEndian := AValue;
  450.   Result.BigEndian := SwapDWord(AValue);
  451. end;
  452. function BuildVolumeDateTime(const ADateTime: TDateTime; const AGMTOffset:
  453.   Byte): TVolumeDateTime;
  454. var
  455.   Hour, Min, Sec, MSec,
  456.     Year, Month, Day: Word;
  457.   s: string;
  458. begin
  459.   DecodeTime(ADateTime, Hour, Min, Sec, MSec);
  460.   DecodeDate(ADateTime, Year, Month, Day);
  461.   Result.GMTOffset := AGMTOffset;
  462.   s := IntToStr(Hour);
  463.   StrPCopy(Result.Hour, s);
  464.   s := IntToStr(Min);
  465.   StrPCopy(Result.Minute, s);
  466.   s := IntToStr(Sec);
  467.   StrPCopy(Result.Second, s);
  468.   s := IntToStr(MSec);
  469.   StrPCopy(Result.MSeconds, s);
  470.   s := IntToStr(Year);
  471.   StrPCopy(Result.Year, s);
  472.   s := IntToStr(Month);
  473.   StrPCopy(Result.Month, s);
  474.   s := IntToStr(Day);
  475.   StrPCopy(Result.Day, s);
  476. end;
  477. function BuildDirectoryDateTime(const ADateTime: TDateTime; const AGMTOffset:
  478.   Byte): TDirectoryDateTime;
  479. var
  480.   Hour, Min, Sec, MSec,
  481.     Year, Month, Day: Word;
  482. begin
  483.   DecodeTime(ADateTime, Hour, Min, Sec, MSec);
  484.   DecodeDate(ADateTime, Year, Month, Day);
  485.   Result.GMTOffset := AGMTOffset;
  486.   Result.Hour := Hour;
  487.   Result.Minute := Min;
  488.   Result.Second := Sec;
  489.   Result.Year := Year;
  490.   Result.Month := Month;
  491.   Result.Day := Day;
  492. end;
  493. function RetrieveFileSize(const AFileName: string): LongWord;
  494. var
  495.   SR: TSearchRec;
  496. begin
  497.   Result := 0;
  498.   if (FileExists(AFileName)) and
  499.     (FindFirst(AFileName, faAnyFile, SR) = 0) then
  500.   begin
  501.     if ((SR.Attr and faDirectory) = 0) and
  502.       ((SR.Attr and faVolumeID) = 0) then
  503.       Result := SR.Size;
  504.       FindClose(sr);
  505.   end;
  506. end;
  507. function Sgn(X: Extended): Integer;
  508. begin
  509.   if X < 0 then
  510.     Result := -1
  511.   else if X = 0 then
  512.     Result := 0
  513.   else
  514.     Result := 1;
  515. end;
  516. function RoundUp(X: Extended): Integer;
  517. var
  518.   Temp: Extended;
  519. begin
  520.   Temp := Int(X) + Sgn(Frac(X));
  521.   Result := round(Temp);
  522. end;
  523. function IsAdministrator: Boolean;
  524. var
  525.   hAccessToken: THandle;
  526.   ptgGroups: PTokenGroups;
  527.   dwInfoBufferSize: DWORD;
  528.   psidAdministrators: PSID;
  529.   x: Integer;
  530.   bSuccess: BOOL;
  531. begin
  532.   Result := False;
  533.   bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
  534.     hAccessToken);
  535.   if not bSuccess then
  536.   begin
  537.     if GetLastError = ERROR_NO_TOKEN then
  538.       bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
  539.         hAccessToken);
  540.   end;
  541.   if bSuccess then
  542.   begin
  543.     GetMem(ptgGroups, 1024);
  544.     bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
  545.       ptgGroups, 1024, dwInfoBufferSize);
  546.     CloseHandle(hAccessToken);
  547.     if bSuccess then
  548.     begin
  549.       AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
  550.         SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
  551.         0, 0, 0, 0, 0, 0, psidAdministrators);
  552. {$R-}
  553.       for x := 0 to ptgGroups.GroupCount - 1 do
  554.         if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
  555.         begin
  556.           Result := True;
  557.           Break;
  558.         end;
  559. {$R+}
  560.       FreeSid(psidAdministrators);
  561.     end;
  562.     FreeMem(ptgGroups);
  563.   end;
  564. end;
  565. function Endian(const Source; var Destination; const Count: Integer): Boolean;
  566. var
  567.   PSource, PDestination: PChar;
  568.   I: Integer;
  569. begin
  570.   Result := False;
  571.   PSource := @Source;
  572.   PDestination := PChar(@Destination) + Count;
  573.   for i := 0 to Count - 1 do
  574.   begin
  575.     Dec(PDestination);
  576.     pDestination^ := PSource^;
  577.     Inc(PSource);
  578.     Result := True;
  579.   end;
  580. end;
  581. function EndianToIntelBytes(const AValue: array of Byte; Count: Byte): Integer;
  582. var
  583.   I: Integer;
  584. begin
  585.   Result := 0;
  586.   for I := 0 to Count - 1 do
  587.   begin
  588.     Result := (AValue[I] shl ((Count - (I + 1)) * 8) or Result);
  589.   end;
  590. end;
  591. function GetLBA(const Byte1, Byte2, Byte3, Byte4: Byte): LongWord;
  592. begin
  593.   Result := (Byte1 shl 24) or (Byte2 shl 16) or (Byte3 shl 8) or Byte4;
  594. end;
  595. function HMSFtoLBA(const AHour, AMinute, ASecond, AFrame: Byte): LongWord;
  596. begin
  597.   Result := (AHour * 60 * 60 * 75) + (AMinute * 60 * 75) + (ASecond * 75) + AFrame;
  598. end;
  599. function LBA2HMSF(LBA: Integer): string;
  600. var
  601.   M, S, F: Integer;
  602. begin
  603.   F := (LBA mod 75);
  604.   S := (LBA div 75) mod 60;
  605.   M := (LBA div 75) div 60;
  606.   Result := Format('%02.02d:%02.02d:%02.02d', [m, s, f])
  607. end;
  608. Procedure LBA2MSF(Const LBA: Integer; Var Min, Sec, Frame :Integer);
  609. begin
  610.   Frame := (LBA mod 75);
  611.   Sec := (LBA div 75) mod 60;
  612.   Min := (LBA div 75) div 60;
  613. end;
  614. function LBA2PreCDDB(LBA: Integer): Integer;
  615. var
  616.   M, S, Start: Integer;
  617. begin
  618.   Start := 150 + LBA;
  619.   S := (Start div 75) mod 60;
  620.   M := (Start div 75) div 60;
  621.   Result := ((M * 60) + S);
  622. end;
  623. function TimePos2SectorPos(Min, Sec, Frame : longint) : longint;
  624. begin
  625.     Result := longint(Min) * 4500 + Longint(Sec) * 75 + Frame - 150;
  626. end;
  627. function SectorPos2TimePos(SectorPos : longint) : longint;
  628. var
  629.     Min, Sec, Frame : longint;
  630. begin
  631.     Frame := SectorPos mod 75;
  632.     Sec   := ((SectorPos + 150) div 75) mod 60;
  633.     Min   := (SectorPos + 150) div 4500;
  634.     Result := (Min shl 16) + (Sec shl 8) + Frame;
  635. end;
  636. function HiWord(Lx: LongWord): Word;
  637. begin
  638.   Result := (Lx shr 16) and $FFFF;
  639. end;
  640. function LoWord(Lx: LongWord): Word;
  641. begin
  642.   Result := Lx;
  643. end;
  644. function HiByte(Lx: Word): Byte;
  645. begin
  646.   Result := (Lx shr 8) and $FF;
  647. end;
  648. function LoByte(Lx: Word): Byte;
  649. begin
  650.   Result := Lx and $FF;
  651. end;
  652. function IsBitSet(const Value: LongWord; const Bit: Byte): Boolean;
  653. begin
  654.   Result := (Value and (1 shl Bit)) <> 0;
  655. end;
  656. function BitOn(const Value: LongWord; const Bit: Byte): LongWord;
  657. begin
  658.   Result := Value or (1 shl Bit);
  659. end;
  660. function BitOff(const Value: LongWord; const Bit: Byte): LongWord;
  661. begin
  662.   Result := Value and ((1 shl Bit) xor $FFFFFFFF);
  663. end;
  664. function BitToggle(const Value: LongWord; const Bit: Byte): LongWord;
  665. begin
  666.   Result := Value xor (1 shl Bit);
  667. end;
  668. function ByteToBin(Value: Byte): string;
  669. var
  670.   I: Integer;
  671. begin
  672.   Result := StringOfChar('0', 8);
  673.   for I := 0 to 7 do
  674.   begin
  675.     if (Value mod 2) = 1 then
  676.       Result[8 - i] := '1';
  677.     Value := Value div 2;
  678.   end;
  679. end;
  680. function GetShortFilename(const FileName: TFileName): TFileName;
  681. var
  682.   buffer: array[0..MAX_PATH - 1] of char;
  683. begin
  684.   SetString(Result, buffer, GetShortPathName(pchar(FileName), buffer, MAX_PATH -
  685.     1));
  686. end;
  687. function GetISOFilename(const FileName: string): string;
  688. var
  689.   TempRes: string;
  690.   Ext: string;
  691. begin
  692.   if length(Filename) > 12 then
  693.   begin
  694.     Ext := extractfileext(Filename);
  695.     TempRes := copy(Filename, 1, 6);
  696.     TempRes := TempRes + '~1' + Ext + ';1';
  697.   end
  698.   else
  699.     TempRes := Filename;
  700.   Result := UpperCase(TempRes);
  701. end;
  702. function CDDB_Sum(N: Integer): Integer;
  703. var
  704.   Ret: Integer;
  705. begin
  706.   Ret := 0;
  707.   while (N > 0) do
  708.   begin
  709.     Ret := Ret + (N mod 10);
  710.     N := N div 10;
  711.   end;
  712.   Result := Ret;
  713. end;
  714. end.