VE ESTA OUTRA UNIT
unit IdeSN; interface function GetIdeSN : String; function GetIdeDiskSerialNumber( ControllerNumber, DriveNumber : Integer ): String; implementation uses Windows, SysUtils; // only for Win32Platform, SysErrorMessage and class Exception {$IFDEF VER150} {$DEFINE VER140} {$ENDIF} {$IFNDEF VER140} procedure RaiseLastOSError; begin RaiseLastWin32Error; end; {$ENDIF} function GetIdeDiskSerialNumber( ControllerNumber, DriveNumber : Integer ) : String; type TSrbIoControl = packed record HeaderLength : ULONG; Signature : Array[0..7] of Char; Timeout : ULONG; ControlCode : ULONG; ReturnCode : ULONG; Length : ULONG; end; SRB_IO_CONTROL = TSrbIoControl; PSrbIoControl = ^TSrbIoControl; TIDERegs = packed record bFeaturesReg : Byte; bSectorCountReg : Byte; bSectorNumberReg : Byte; bCylLowReg : Byte; bCylHighReg : Byte; bDriveHeadReg : Byte; bCommandReg : Byte; bReserved : Byte; end; IDEREGS = TIDERegs; PIDERegs = ^TIDERegs; TSendCmdInParams = packed record cBufferSize : DWORD; irDriveRegs : TIDERegs; bDriveNumber : Byte; bReserved : Array[0..2] of Byte; dwReserved : Array[0..3] of DWORD; bBuffer : Array[0..0] of Byte; end; SENDCMDINPARAMS = TSendCmdInParams; PSendCmdInParams = ^TSendCmdInParams; TIdSector = packed record wGenConfig : Word; wNumCyls : Word; wReserved : Word; wNumHeads : Word; wBytesPerTrack : Word; wBytesPerSector : Word; wSectorsPerTrack : Word; wVendorUnique : Array[0..2] of Word; sSerialNumber : Array[0..19] of Char; wBufferType : Word; wBufferSize : Word; wECCSize : Word; sFirmwareRev : Array[0..7] of Char; sModelNumber : Array[0..39] of Char; wMoreVendorUnique : Word; wDoubleWordIO : Word; wCapabilities : Word; wReserved1 : Word; wPIOTiming : Word; wDMATiming : Word; wBS : Word; wNumCurrentCyls : Word; wNumCurrentHeads : Word; wNumCurrentSectorsPerTrack : Word; ulCurrentSectorCapacity : ULONG; wMultSectorStuff : Word; ulTotalAddressableSectors : ULONG; wSingleWordDMA : Word; wMultiWordDMA : Word; bReserved : Array[0..127] of Byte; end; PIdSector = ^TIdSector; const IDE_ID_FUNCTION = $EC; IDENTIFY_BUFFER_SIZE = 512; DFP_RECEIVE_DRIVE_DATA = $0007c088; IOCTL_SCSI_MINIPORT = $0004d008; IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501; DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE; BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize; W9xBufferSize = IDENTIFY_BUFFER_SIZE+16; var hDevice : THandle; cbBytesReturned : DWORD; s : String; pInData : PSendCmdInParams; pOutData : Pointer; // PSendCmdInParams; Buffer : Array[0..BufferSize-1] of Byte; srbControl : TSrbIoControl absolute Buffer; procedure ChangeByteOrder( var Data; Size : Integer ); var ptr : PChar; i : Integer; c : Char; begin ptr := @Data; for i := 0 to (Size shr 1)-1 do begin c := ptr^; ptr^ := (ptr+1)^; (ptr+1)^ := c; Inc(ptr,2); end; end; begin Result := ''; FillChar(Buffer,BufferSize,#0); if Win32Platform=VER_PLATFORM_WIN32_NT then begin Str(ControllerNumber,s); hDevice := CreateFile( PChar('\\.\Scsi'+s+':'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); if hDevice=INVALID_HANDLE_VALUE then RaiseLastOSError; try srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL); System.Move('SCSIDISK',srbControl.Signature,8); srbControl.Timeout := 2; srbControl.Length := DataSize; srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY; pInData := PSendCmdInParams(PChar(@Buffer)+SizeOf(SRB_IO_CONTROL)); pOutData := pInData; with pInData^ do begin cBufferSize := IDENTIFY_BUFFER_SIZE; bDriveNumber := DriveNumber; with irDriveRegs do begin bFeaturesReg := 0; bSectorCountReg := 1; bSectorNumberReg := 1; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0 or ((DriveNumber and 1) shl 4); bCommandReg := IDE_ID_FUNCTION; end; end; if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then RaiseLastOSError; finally CloseHandle(hDevice); end; end else begin hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 ); if hDevice=INVALID_HANDLE_VALUE then RaiseLastOSError; try pInData := PSendCmdInParams(@Buffer); pOutData := PChar(@pInData^.bBuffer); with pInData^ do begin cBufferSize := IDENTIFY_BUFFER_SIZE; bDriveNumber := DriveNumber; with irDriveRegs do begin bFeaturesReg := 0; bSectorCountReg := 1; bSectorNumberReg := 1; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0 or ((DriveNumber and 1) shl 4); bCommandReg := IDE_ID_FUNCTION; end; end; if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData, SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize, cbBytesReturned, nil ) then RaiseLastOSError; finally CloseHandle(hDevice); end; end; with PIdSector(PChar(pOutData)+16)^ do begin ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber)); SetString(Result,sSerialNumber,SizeOf(sSerialNumber)); end; Result := Trim(Result); end; function GetIdeSN : String; var iController, iDrive, maxController : Integer; begin Result := ''; maxController := 15; if Win32Platform<>VER_PLATFORM_WIN32_NT then maxController := 0; for iController := 0 to maxController do begin for iDrive := 0 to 4 do begin try Result := GetIdeDiskSerialNumber(iController,iDrive); if Result<>'' then Exit; except // Sem tratamento de Exceções. end; end; end; end; end. ADRIANO MICRO CENTER ----- Original Message ----- From: Vinicius Ribeiro To: delphi-br@yahoogrupos.com.br Sent: Saturday, July 02, 2005 10:32 AM Subject: Re: RES: RES: [delphi-br] serial do hd Adriano, Seria o numero de série FISICO do HD. Essa funcao pega o numer de serie LOGICO, correto? [ ]'s Vinicius Ribeiro Adriano (Micro Center) escreveu: > Detectando o Numero Serial do HD > Function SerialNum(FDrive:String) :String; > Var > Serial:DWord; > DirLen,Flags: DWord; > DLabel : Array[0..11] of Char; > begin > Try > GetVolumeInformation(PChar(FDrive+':\'),dLabel,12,@Serial,DirLen,Flags,nil,0); > Result := IntToHex(Serial,8); > Except Result :=''; > end; > end; > > Adriano > Micro Center.......... > ----- Original Message ----- > From: Vinicius Ribeiro > To: delphi-br@yahoogrupos.com.br > Sent: Saturday, July 02, 2005 9:35 AM > Subject: Re: RES: RES: [delphi-br] serial do hd > > > Wilson, > > Eu tenho essa funcao mas la onde trabalho. To em casa agora e soh > trabalho na segunda. Porem, fiz testes com essa funcao em 20 > maquinas la > da empresa. Essa funcao funciona bem porem teve alguns HDs que retornou > VAZIO. Ai vi la no HD se tinha numero de serie impresso no rotulo e > tinha. Ou seja a funcao nao retorna de todos, nao me pergunte o porque. > > Se alguem aqui quiser posso disponibiliza-la pra lista, mas soh na > segunda. Inclusive eu peguei de alguem q mandou pra lista aqui mesmo. > > Stock, vc testou essa funcao em varios micros com marcas de HD > diferente? Retornou em todas? Se sim poderia disponibiliza-la para a > lista? > > Abraco! > > Vinicius Ribeiro > > Wilson Valdevite escreveu: > > > Desculpe a minha curiosidade pois isso tbem me interessa, mas por > que não > > mandar para a lista? > > > > Wilson > > ----- Original Message ----- > > From: "Stock" <[EMAIL PROTECTED]> > > To: <delphi-br@yahoogrupos.com.br> > > Sent: Friday, July 01, 2005 5:15 PM > > Subject: Res: Re: RES: RES: [delphi-br] serial do hd > > > > > > Esta função pega o serial do volume, se o volume for clonado, sua > > aplicação vai rodar em outro normalmente... > > > > use a que pega o serial fisico do disco... > > > > me contate em pvt, eu te mando a função com exemplo > > > > > > [EMAIL PROTECTED] > > 600 modelos de sites profissionais - Imperdivel > > http://www.kitsites.com/index.php?ref=50 > > > > -------Mensagem original------- > > > > De: Leandro > > Data: 07/01/05 16:55:18 > > Para: delphi-br@yahoogrupos.com.br > > Assunto: Re: RES: RES: [delphi-br] serial do hd > > > > uso essa danada: > > > > function TCritica.PegaSerieHD: String; > > var > > SerialNum : Dword; > > a, b : dword; > > Buffer : array [0..255] of char; > > begin > > if > > GetVolumeInformation('c:\',buffer,sizeof(buffer),@serialnum,a,b,nil,0) > > then > > Result := inttohex(serialnum,8) > > else > > Result := ''; > > end; > > > > Att, > > > > Leandro > > > > ----- Original Message ----- > > From: "aderson rezende" <[EMAIL PROTECTED]> > > To: <delphi-br@yahoogrupos.com.br> > > Sent: Friday, July 01, 2005 4:30 PM > > Subject: Re: RES: RES: [delphi-br] serial do hd > > > > > > obrigado > > > > continuo precisando da dica de como fazer isso como pegar tal numero > > > > > > > > Walter Alves Chagas Junior <[EMAIL PROTECTED]> escreveu: > > Então não pegue o serial do voluma do HD, pegue o serial da > controladora > > > > > > > > > > []s > > > > Walter Alves Chagas Junior > > Projeto e desenvolvimento > > Telemont Engenharia de telecomunicações > > Belo Horizonte - MG - Brazil > > [EMAIL PROTECTED] > > Fone: (31) 3389-8215 Fax: (31) 3389-8200 > > > > > > > -----Mensagem original----- > > > De: aderson rezende [mailto:[EMAIL PROTECTED] > > > Enviada em: sexta-feira, 1 de julho de 2005 15:01 > > > Para: delphi-br@yahoogrupos.com.br > > > Assunto: Re: RES: [delphi-br] serial do hd > > > > > > > > > quase isso Walter a ideia é colocar um tempo de validade > > > para locação da aplicação e um dos parametros pensei no serial do HD > > > > > > > > > > > > > > > > > > Walter Alves Chagas Junior <[EMAIL PROTECTED]> escreveu: > > > Desculpe intrometer no assunto amigo, mas você tá querendo fazer > algum > > > mecanismo de proteção contra cópia não autorizada? > > > > > > > > > > > > []s > > > > > > Walter Alves Chagas Junior > > > Projeto e desenvolvimento > > > Telemont Engenharia de telecomunicações > > > Belo Horizonte - MG - Brazil > > > [EMAIL PROTECTED] > > > Fone: (31) 3389-8215 Fax: (31) 3389-8200 > > > > > > > > > > -----Mensagem original----- > > > > De: aderson rezende [mailto:[EMAIL PROTECTED] > > > > Enviada em: sexta-feira, 1 de julho de 2005 10:23 > > > > Para: delphi-br@yahoogrupos.com.br > > > > Assunto: [delphi-br] serial do hd > > > > > > > > > > > > preciso pegar o serial do HD > > > > usei essa função e cada hora vem um valor diferente ou > > > > melhor sempre da dois valores 1 por vez > > > > > > > > > > > > Function SerialNum(FDrive:String) > > > > :String;VarSerial:DWord;DirLen,Flags: DWord;DLabel : > > > > Array[0..11] of Char;beginTry > > > > GetVolumeInformation(PChar(FDrive+':\'),dLabel,12,@Serial,DirL > > > > en,Flags,nil,0);Result := IntToHex(Serial,8); Except Result > > > > :='';end;end; como faço para retornar o resultado dessa > > > > função???pode ser esse o erro > > > > > > > > > > > > > > > > > > > > > > > > > > > _______________________________________________________ > Yahoo! Acesso Grátis - Internet rápida e grátis. > Instale o discador agora! http://br.acesso.yahoo.com/ > > > -- > <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> > > Para ver as mensagens antigas, acesse: > http://br.groups.yahoo.com/group/delphi-br/messages > > Para falar com o moderador, envie um e-mail para: > [EMAIL PROTECTED] ou [EMAIL PROTECTED] > > > > > ------------------------------------------------------------------------------ > Links do Yahoo! Grupos > > a.. Para visitar o site do seu grupo na web, acesse: > http://br.groups.yahoo.com/group/delphi-br/ > > b.. Para sair deste grupo, envie um e-mail para: > [EMAIL PROTECTED] > > c.. O uso que você faz do Yahoo! Grupos está sujeito aos Termos do > Serviço do Yahoo!. > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > -- > <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> > > Para ver as mensagens antigas, acesse: > http://br.groups.yahoo.com/group/delphi-br/messages > > Para falar com o moderador, envie um e-mail para: > [EMAIL PROTECTED] ou [EMAIL PROTECTED] > > > > ------------------------------------------------------------------------ > *Links do Yahoo! Grupos* > > * Para visitar o site do seu grupo na web, acesse: > http://br.groups.yahoo.com/group/delphi-br/ > > * Para sair deste grupo, envie um e-mail para: > [EMAIL PROTECTED] > <mailto:[EMAIL PROTECTED]> > > * O uso que você faz do Yahoo! Grupos está sujeito aos Termos do > Serviço do Yahoo! <http://br.yahoo.com/info/utos.html>. > > _______________________________________________________ Yahoo! Acesso Grátis - Internet rápida e grátis. Instale o discador agora! http://br.acesso.yahoo.com/ -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] ------------------------------------------------------------------------------ Links do Yahoo! Grupos a.. Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ b.. Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] c.. O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço do Yahoo!. [As partes desta mensagem que não continham texto foram removidas] -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html