Advertisement
Guest User

Untitled

a guest
Sep 25th, 2013
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.91 KB | None | 0 0
  1.  
  2.  
  3. {
  4. for displaying the details of hard drives in
  5.  
  6. 06/11/2000 Lynn McGuire written with many contributions from others,
  7. IDE drives only under Windows NT/2K and 9X,
  8. maybe SCSI drives later
  9.  
  10. translated by Wyfinger 14/08/2007, wyfinger@mail.ru
  11. }
  12.  
  13. unit Unit1;
  14.  
  15. interface
  16.  
  17. uses
  18. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  19. Dialogs, StdCtrls;
  20.  
  21. type
  22. TForm1 = class(TForm)
  23. Memo1: TMemo;
  24. Button1: TButton;
  25. Label1: TLabel;
  26. procedure Button1Click(Sender: TObject);
  27. private
  28. { Private declarations }
  29. public
  30. { Public declarations }
  31. end;
  32.  
  33. var
  34. Form1: TForm1;
  35.  
  36. type
  37.  
  38. // GETVERSIONOUTPARAMS contains the data returned from the
  39. // Get Driver Version function.
  40. GETVERSIONOUTPARAMS = record
  41. bVersion : BYTE; // Binary driver version.
  42. bRevision : BYTE; // Binary driver revision.
  43. bReserved : BYTE; // Not used.
  44. bIDEDeviceMap : BYTE; // Bit map of IDE devices.
  45. fCapabilities : DWORD; // Bit mask of driver capabilities.
  46. dwReserved : array[0..3] of DWORD; // For future use.
  47. end;
  48.  
  49. PGETVERSIONOUTPARAMS = ^GETVERSIONOUTPARAMS;
  50. LPGETVERSIONOUTPARAMS = ^GETVERSIONOUTPARAMS;
  51.  
  52. // IDE registers
  53. IDEREGS = record
  54. bFeaturesReg : BYTE; // Used for specifying SMART "commands".
  55. bSectorCountReg : BYTE; // IDE sector count register
  56. bSectorNumberReg : BYTE; // IDE sector number register
  57. bCylLowReg : BYTE; // IDE low order cylinder value
  58. bCylHighReg : BYTE; // IDE high order cylinder value
  59. bDriveHeadReg : BYTE; // IDE drive/head register
  60. bCommandReg : BYTE; // Actual IDE command.
  61. bReserved : BYTE; // reserved for future use. Must be zero.
  62. end;
  63.  
  64. PIDEREGS = ^IDEREGS;
  65. LPIDEREGS = ^IDEREGS;
  66.  
  67. // SENDCMDINPARAMS contains the input parameters for the
  68. // Send Command to Drive function.
  69. SENDCMDINPARAMS = record
  70. cBufferSize : DWORD; // Buffer size in bytes
  71. irDriveRegs : IDEREGS; // Structure with drive register values.
  72. bDriveNumber : BYTE; // Physical drive number to send
  73. // command to (0,1,2,3).
  74. bReserved : array[0..2] of BYTE; // Reserved for future expansion.
  75. dwReserved : array[0..3] of DWORD; // For future use.
  76. bBuffer : array[0..0] of BYTE; // Input buffer.
  77. end;
  78.  
  79. PSENDCMDINPARAMS = ^SENDCMDINPARAMS;
  80. LPSENDCMDINPARAMS = ^SENDCMDINPARAMS;
  81.  
  82. // Status returned from driver
  83. DRIVERSTATUS = record
  84. bDriverError : BYTE; // Error code from driver, or 0 if no error.
  85. bIDEStatus : BYTE; // Contents of IDE Error register.
  86. // Only valid when bDriverError is SMART_IDE_ERROR.
  87. bReserved : array[0..1] of BYTE; // Reserved for future expansion.
  88. dwReserved : array[0..1] of DWORD; // Reserved for future expansion.
  89. end;
  90.  
  91. PDRIVERSTATUS = ^DRIVERSTATUS;
  92. LPDRIVERSTATUS = ^DRIVERSTATUS;
  93.  
  94. // Structure returned by PhysicalDrive IOCTL for several commands
  95. SENDCMDOUTPARAMS = record
  96. cBufferSize : DWORD; // Size of bBuffer in bytes
  97. DriverStatus : DRIVERSTATUS; // Driver status structure.
  98. bBuffer : array[0..0] of BYTE; // Buffer of arbitrary length in which to store the data read from the // drive.
  99. end;
  100.  
  101. PSENDCMDOUTPARAMS = ^SENDCMDOUTPARAMS;
  102. LPSENDCMDOUTPARAMS = ^SENDCMDOUTPARAMS;
  103.  
  104. USHORT = BYTE;
  105.  
  106. // The following struct defines the interesting part of the IDENTIFY
  107. // buffer:
  108. IDSECTOR = record
  109. wGenConfig : USHORT;
  110. wNumCyls : USHORT;
  111. wReserved : USHORT;
  112. wNumHeads : USHORT;
  113. wBytesPerTrack : USHORT;
  114. wBytesPerSector : USHORT;
  115. wSectorsPerTrack : USHORT;
  116. wVendorUnique : array[0..2] of USHORT;
  117. sSerialNumber : array[0..19] of CHAR;
  118. wBufferType : USHORT;
  119. wBufferSize : USHORT;
  120. wECCSize : USHORT;
  121. sFirmwareRev : array[0..7] of CHAR;
  122. sModelNumber : array[0..39] of CHAR;
  123. wMoreVendorUnique : USHORT;
  124. wDoubleWordIO : USHORT;
  125. wCapabilities : USHORT;
  126. wReserved1 : USHORT;
  127. wPIOTiming : USHORT;
  128. wDMATiming : USHORT;
  129. wBS : USHORT;
  130. wNumCurrentCyls : USHORT;
  131. wNumCurrentHeads : USHORT;
  132. wNumCurrentSectorsPerTrack : USHORT;
  133. ulCurrentSectorCapacity : ULONG;
  134. wMultSectorStuff : USHORT;
  135. ulTotalAddressableSectors : ULONG;
  136. wSingleWordDMA : USHORT;
  137. wMultiWordDMA : USHORT;
  138. bReserved : array[0..127] of BYTE;
  139. end;
  140.  
  141. PIDSECTOR = ^IDSECTOR;
  142.  
  143. SRB_IO_CONTROL = record
  144. HeaderLength : ULONG;
  145. Signature : array[0..7] of UCHAR;
  146. Timeout : ULONG;
  147. ControlCode : ULONG;
  148. ReturnCode : ULONG;// ReturnCode;
  149. Length : ULONG;
  150. end;
  151.  
  152. PSRB_IO_CONTROL = ^SRB_IO_CONTROL;
  153.  
  154. TDWArray = array of DWORD;
  155.  
  156. const
  157. // Required to ensure correct PhysicalDrive IOCTL structure setup
  158. MAX_IDE_DRIVES = 4;
  159. // Max number of drives assuming primary/secondary, master/slave topology
  160. IDENTIFY_BUFFER_SIZE = 512;
  161. // IOCTL commands
  162. DFP_GET_VERSION = $00074080;
  163. DFP_SEND_DRIVE_COMMAND = $0007c084;
  164. DFP_RECEIVE_DRIVE_DATA = $0007c088;
  165.  
  166. FILE_DEVICE_SCSI = $0000001b;
  167. IOCTL_SCSI_MINIPORT_IDENTIFY = ((FILE_DEVICE_SCSI shl 16) + $0501);
  168. IOCTL_SCSI_MINIPORT = $0004D008; // see NTDDSCSI.H for definition
  169.  
  170. // Bits returned in the fCapabilities member of GETVERSIONOUTPARAMS
  171. CAP_IDE_ID_FUNCTION = 1; // ATA ID command supported
  172. CAP_IDE_ATAPI_ID = 2; // ATAPI ID command supported
  173. CAP_IDE_EXECUTE_SMART_FUNCTION = 4; // SMART commannds supported
  174.  
  175. // Valid values for the bCommandReg member of IDEREGS.
  176. IDE_ATAPI_IDENTIFY = $0A1; // Returns ID sector for ATAPI.
  177. IDE_ATA_IDENTIFY = $0EC; // Returns ID sector for ATA.
  178.  
  179. var
  180. // Define global buffers.
  181. IdOutCmd : Integer = SizeOf(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1;
  182.  
  183.  
  184. function DoIDENTIFY(hPhysicalDriveIOCTL: THandle; pSCIP: PSENDCMDINPARAMS;
  185. pSCOP: PSENDCMDOUTPARAMS; bIDCmd, bDriveNum: BYTE;
  186. lpcbBytesReturned: PDWORD): Boolean;
  187. procedure PrintIdeInfo(drive: Integer; diskdata : array of DWORD);
  188.  
  189. implementation
  190.  
  191. {$R *.dfm}
  192.  
  193. function ReadPhysicalDriveInNT: Boolean;
  194. var
  195. done : Boolean;
  196. drive : Integer;
  197. driveName : PChar;
  198. hPhysicalDriveIOCTL : THandle;
  199. VersionParams : GETVERSIONOUTPARAMS;
  200. cbBytesReturned : DWORD;
  201. bIDCmd : BYTE;
  202. scip : SENDCMDINPARAMS;
  203. diskdata : array[0..255] of DWORD;
  204. ijk : Integer;
  205. pIdSector : USHORT;
  206. //pOut :
  207. begin
  208. done := False;
  209. drive := 0;
  210. for drive := 0 to MAX_IDE_DRIVES-1 do
  211. begin
  212. hPhysicalDriveIOCTL := 0;
  213. // Try to get a handle to PhysicalDrive IOCTL, report failure
  214. // and exit if can't.
  215. driveName := PChar(Format('\\.\PhysicalDrive%d', [drive]));
  216. // Windows NT, Windows 2000, must have admin rights
  217. hPhysicalDriveIOCTL := CreateFile(driveName,
  218. { dwDesiredAccess } GENERIC_READ or GENERIC_WRITE,
  219. { dwShareMode } FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
  220. OPEN_EXISTING, 0, 0);
  221. if hPhysicalDriveIOCTL <> INVALID_HANDLE_VALUE then
  222. begin
  223. // Get the version, etc of PhysicalDrive IOCTL
  224. FillChar(VersionParams, sizeof(VersionParams), 0);
  225. if not DeviceIoControl(hPhysicalDriveIOCTL, DFP_GET_VERSION,
  226. nil, 0, @VersionParams, sizeof(VersionParams),
  227. cbBytesReturned, nil) then
  228. begin
  229. ShowMessage('DFP_GET_VERSION failed for drive '+ driveName);
  230. Exit;
  231. end;
  232. if VersionParams.bIDEDeviceMap > 0 then
  233. begin
  234. // Now, get the ID sector for all IDE devices in the system.
  235. // If the device is ATAPI use the IDE_ATAPI_IDENTIFY command,
  236. // otherwise use the IDE_ATA_IDENTIFY command
  237. if Boolean(VersionParams.bIDEDeviceMap shr drive and $010) then
  238. bIDCmd := IDE_ATAPI_IDENTIFY else bIDCmd := IDE_ATA_IDENTIFY;
  239.  
  240. FillChar(scip, sizeof(scip), 0);
  241. FillChar(diskdata, Length(diskdata), 0);
  242.  
  243. if DoIDENTIFY(hPhysicalDriveIOCTL, @scip,
  244. @diskdata, bIDCmd, drive, @cbBytesReturned) then
  245. begin
  246. ijk := 0;
  247. //pIdSector := @PSENDCMDOUTPARAMS(IdOutCmd).bBuffer[0]; // ????
  248. {for ijk := 0 to 256-1 do
  249. diskdata[ijk] := PSENDCMDOUTPARAMS(IdOutCmd).bBuffer[ijk]; }
  250. PrintIdeInfo(drive, diskdata);
  251. done := True;
  252. end;
  253. end;
  254. CloseHandle(hPhysicalDriveIOCTL);
  255. end;
  256. end;
  257.  
  258. end;
  259.  
  260. function DoIDENTIFY(hPhysicalDriveIOCTL: THandle; pSCIP: PSENDCMDINPARAMS;
  261. pSCOP: PSENDCMDOUTPARAMS; bIDCmd, bDriveNum: BYTE;
  262. lpcbBytesReturned: PDWORD): Boolean;
  263. var
  264. cbBytesReturned : DWORD;
  265. begin
  266. // Set up data structures for IDENTIFY command.
  267. pSCIP.cBufferSize := IDENTIFY_BUFFER_SIZE;
  268. pSCIP.irDriveRegs.bFeaturesReg := 0;
  269. pSCIP.irDriveRegs.bSectorCountReg := 1;
  270. pSCIP.irDriveRegs.bSectorNumberReg := 1;
  271. pSCIP.irDriveRegs.bCylLowReg := 0;
  272. pSCIP.irDriveRegs.bCylHighReg := 0;
  273.  
  274. // Compute the drive number.
  275. pSCIP.irDriveRegs.bDriveHeadReg := $0A0 or ((bDriveNum and 1) shl 4);
  276.  
  277. // The command can either be IDE identify or ATAPI identify.
  278. pSCIP.irDriveRegs.bCommandReg := bIDCmd;
  279. pSCIP.bDriveNumber := bDriveNum;
  280. pSCIP.cBufferSize := IDENTIFY_BUFFER_SIZE;
  281.  
  282. Result := DeviceIoControl(hPhysicalDriveIOCTL, DFP_RECEIVE_DRIVE_DATA,
  283. pSCIP, sizeof(SENDCMDINPARAMS) - 1, pSCOP,
  284. sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
  285. cbBytesReturned, nil);
  286. end;
  287.  
  288. function ConvertToString(diskdata : Pointer; firstIndex,
  289. lastIndex: Integer): string;
  290. var
  291. index : Integer;
  292. ch : char;
  293. begin
  294. Result := '';
  295. // each integer has two characters stored in it backwards
  296. for index := firstIndex to lastIndex do
  297. begin
  298. // get high byte for 1st character
  299. ch := Char(Integer(Pointer(Integer(diskdata)+2*index)^) shr 8);
  300. Result := Result + ch;
  301. ch := Char(Integer(Pointer(Integer(diskdata)+2*index)^));
  302. Result := Result + ch;
  303. end;
  304.  
  305. // end the string
  306. Result := Result + #0;
  307. end;
  308.  
  309. procedure printf(mask: string; Args: array of const);
  310. begin
  311. Form1.Memo1.Lines.Add(Format(mask, Args));
  312. end;
  313.  
  314. procedure PrintIdeInfo(drive: Integer; diskdata : array of DWORD);
  315. var
  316. DriveType : string;
  317. Header : string;
  318. begin
  319. // get drive type info
  320. if Boolean(diskdata[4] and $00080) then DriveType := 'Removable'
  321. else if Boolean(diskdata[4] and $00040) then DriveType := 'Fixed'
  322. else DriveType := 'Unknown';
  323.  
  324. case drive div 2 of
  325. 0: Header := 'Primary Controller - ';
  326. 1: Header := 'Secondary Controller - ';
  327. 2: Header := 'Tertiary Controller - ';
  328. 3: Header := 'Quaternary Controller - ';
  329. end;
  330.  
  331. case drive mod 2 of
  332. 0: Header := Header + 'Master drive';
  333. 1: Header := Header + 'Slave drive';
  334. end;
  335.  
  336. printf(Header, []);
  337.  
  338. printf('Drive Model Number________________: %s', [ConvertToString (@diskdata, 35, 54)]);
  339. printf('Drive Serial Number_______________: %s', [ConvertToString (@diskdata, 18, 27)]);
  340. printf('Drive Controller Revision Number__: %s', [ConvertToString (@diskdata, 31, 34)]);
  341.  
  342. printf('Controller Buffer Size on Drive___: %u bytes', [Word(Pointer(Integer(@diskdata)+58)^) * 512]);
  343.  
  344. printf('Drive Type________________________: %s', [DriveType]);
  345.  
  346. printf('Physical Geometry: '+
  347. '%u Cylinders, %u Heads, %u Sectors per track',
  348. [Word(Pointer(Integer(@diskdata)+18)^),
  349. Word(Pointer(Integer(@diskdata)+22)^),
  350. Word(Pointer(Integer(@diskdata)+28)^)]);
  351. printf(' ', []);
  352.  
  353. end;
  354.  
  355. procedure TForm1.Button1Click(Sender: TObject);
  356. begin
  357. Memo1.Lines.Clear;
  358. ReadPhysicalDriveInNT;
  359. end;
  360.  
  361. end.
  362.  
  363.  
  364. 1://////////////////////////METHOD 2 WITH CPU PROTECTION///////////////////////////////////
  365. 2:unit Unit1;
  366.  
  367. interface
  368.  
  369. uses
  370. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  371. Dialogs, StdCtrls;
  372.  
  373. type
  374. TForm1 = class(TForm)
  375. Button1: TButton;
  376. procedure Button1Click(Sender: TObject);
  377. private
  378. { Private declarations }
  379. public
  380. { Public declarations }
  381. end;
  382.  
  383. var
  384. Form1: TForm1;
  385.  
  386. implementation
  387.  
  388. {$R *.dfm}
  389. function GetEnvVarValue(const VarName: string): string;
  390. var
  391. BufSize: Integer; // buffer size required for value
  392. begin
  393. // Get required buffer size (inc. terminal #0)
  394. BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
  395. if BufSize > 0 then
  396. begin
  397. // Read env var value into result string
  398. SetLength(Result, BufSize - 1);
  399. GetEnvironmentVariable(PChar(VarName),
  400. PChar(Result), BufSize);
  401. end
  402. else
  403. // No such environment variable
  404. Result := '';
  405. end;
  406.  
  407. {
  408. ---List of different variables---
  409. ALLUSERSPROFILE
  410. APPDATA
  411. CLIENTNAME
  412. CommonProgramFiles
  413. COMPUTERNAME
  414. ComSpec
  415. HOMEDRIVE
  416. HOMEPATH
  417. LOGONSERVER
  418. NUMBER_OF_PROCESSORS
  419. OS
  420. Path
  421. PATHEXT
  422. PCToolsDir
  423. PROCESSOR_ARCHITECTURE
  424. PROCESSOR_IDENTIFIER
  425. PROCESSOR_LEVEL
  426. PROCESSOR_REVISION
  427. ProgramFiles
  428. SESSIONNAME
  429. SystemDrive
  430. SystemRoot
  431. TEMP
  432. TMP
  433. USERDOMAIN
  434. USERNAME
  435. USERPROFILE
  436. windir
  437. }
  438.  
  439.  
  440. procedure TForm1.Button1Click(Sender: TObject);
  441. begin
  442. ShowMessage(GetEnvVarValue('PROCESSOR_IDENTIFIER'));
  443. end;
  444.  
  445. end.
  446. 3:
  447. 4:
  448. 5:
  449. 6:
  450. 7:
  451. 8:
  452. 9:
  453. 10:
  454. 11:
  455. 12:
  456. 13:
  457. 14:
  458. 15:
  459. 16:
  460. 17:
  461. 18:
  462. 19:
  463. 20:
  464. 21:
  465. 22:
  466. 23:
  467. 24:
  468. 25:
  469. 26:
  470. 27:
  471. 28:
  472. 29:
  473. 30:
  474. 31:
  475. 32:
  476. 33:
  477. 34:
  478. 35:
  479. 36:
  480. 37:
  481. 38:
  482. 39:
  483. 40:
  484. 41:
  485. 42:
  486. 43:
  487. 44:
  488. 45:
  489. 46:
  490. 47:
  491. 48:
  492. 49:
  493. 50:
  494. 51:
  495. 52:
  496. 53:
  497. 54:
  498. 55:
  499. 56:
  500. 57:
  501. 58:
  502. 59:
  503. 60:
  504. 61:
  505. 62:
  506. 63:
  507. 64:
  508. 65:
  509. 66:
  510. 67:
  511. 68:
  512. 69:
  513. 70:
  514. 71:
  515. 72:
  516. 73:
  517. 74:
  518. 75:
  519. 76:
  520. 77:
  521. 78:
  522. 79:
  523. 80:
  524. 81:
  525. 82:
  526. 83:
  527. 84:
  528. 85:
  529. 86:
  530. 87:
  531. 88:
  532. 89:
  533. 90:
  534. 91:
  535. 92:
  536. 93:
  537. 94:
  538. 95:
  539. 96:
  540. 97:
  541. 98:
  542. 99:
  543. 100:
  544. 101:
  545. 102:
  546. 103:
  547. 104:
  548. 105:
  549. 106:
  550. 107:
  551. 108:
  552. 109:
  553. 110:
  554. 111:
  555. 112:
  556. 113:
  557. 114:
  558. 115:
  559. 116:
  560. 117:
  561. 118:
  562. 119:
  563. 120:
  564. 121:
  565. 122:
  566. 123:
  567. 124:
  568. 125:
  569. 126:
  570. 127:
  571. 128:
  572. 129:
  573. 130:
  574. 131:
  575. 132:
  576. 133:
  577. 134:
  578. 135:
  579. 136:
  580. 137:
  581. 138:
  582. 139:
  583. 140:
  584. 141:
  585. 142:
  586. 143:
  587. 144:
  588. 145:
  589. 146:
  590. 147:
  591. 148:
  592. 149:
  593. 150:
  594. 151:
  595. 152:
  596. 153:
  597. 154:
  598. 155:
  599. 156:
  600. 157:
  601. 158:
  602. 159:
  603. 160:
  604. 161:
  605. 162:
  606. 163:
  607. 164:
  608. 165:
  609. 166:
  610. 167:
  611. 168:
  612. 169:
  613. 170:
  614. 171:
  615. 172:
  616. 173:
  617. 174:
  618. 175:
  619. 176:
  620. 177:
  621. 178:
  622. 179:
  623. 180:
  624. 181:
  625. 182:
  626. 183:
  627. 184:
  628. 185:
  629. 186:
  630. 187:
  631. 188:
  632. 189:
  633. 190:
  634. 191:
  635. 192:
  636. 193:
  637. 194:
  638. 195:
  639. 196:
  640. 197:
  641. 198:
  642. 199:
  643. 200:
  644. 201:
  645. 202:
  646. 203:
  647. 204:
  648. 205:
  649. 206:
  650. 207:
  651. 208:
  652. 209:
  653. 210:
  654. 211:
  655. 212:
  656. 213:
  657. 214:
  658. 215:
  659. 216:
  660. 217:
  661. 218:
  662. 219:
  663. 220:
  664. 221:
  665. 222:
  666. 223:
  667. 224:
  668. 225:
  669. 226:
  670. 227:
  671. 228:
  672. 229:
  673. 230:
  674. 231:
  675. 232:
  676. 233:
  677. 234:
  678. 235:
  679. 236:
  680. 237:
  681. 238:
  682. 239:
  683. 240:
  684. 241:
  685. 242:
  686. 243:
  687. 244:
  688. 245:
  689. 246:
  690. 247:
  691. 248:
  692. 249:
  693. 250:
  694. 251:
  695. 252:
  696. 253:
  697. 254:
  698. 255:
  699. 256:
  700. 257:
  701. 258:
  702. 259:
  703. 260:
  704. 261:
  705. 262:
  706. 263:
  707. 264:
  708. 265:
  709. 266:
  710. 267:
  711. 268:
  712. 269:
  713. 270:
  714. 271:
  715. 272:
  716. 273:
  717. 274:
  718. 275:
  719. 276:
  720. 277:
  721. 278:
  722. 279:
  723. 280:
  724. 281:
  725. 282:
  726. 283:
  727. 284:
  728. 285:
  729. 286:
  730. 287:
  731. 288:
  732. 289:
  733. 290:
  734. 291:
  735. 292:
  736. 293:
  737. 294:
  738. 295:
  739. 296:
  740. 297:
  741. 298:
  742. 299:
  743. 300:
  744. 301:
  745. 302:
  746. 303:
  747. 304:
  748. 305:
  749. 306:
  750. 307:
  751. 308:
  752. 309:
  753. 310:
  754. 311:
  755. 312:
  756. 313:
  757. 314:
  758. 315:
  759. 316:
  760. 317:
  761. 318:
  762. 319:
  763. 320:
  764. 321:
  765. 322:
  766. 323:
  767. 324:
  768. 325:
  769. 326:
  770. 327:
  771. 328:
  772. 329:
  773. 330:
  774. 331:
  775. 332:
  776. 333:
  777. 334:
  778. 335:
  779. 336:
  780. 337:
  781. 338:
  782. 339:
  783. 340:
  784. 341:
  785. 342:
  786. 343:
  787. 344:
  788. 345:
  789. 346:
  790. 347:
  791. 348:
  792. 349:
  793. 350:
  794. 351:
  795. 352:
  796. 353:
  797. 354:
  798. 355:
  799. 356:
  800. 357:
  801. 358:
  802. 359:
  803.  
  804. Select allOpen in new window
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement