Página 1 de 1

Numero de Seria do HD

Enviado: 24 Jan 2007 12:46
por reunix
Olá pessoal sou novato no forum, e ja estou com duvidas, heh

alguem tem uma rotina pra capturar o Nº de serie do HD, mas veja bem...
é o nº de serie do HD nao o Nº de serie do Volume do HD

para capturar o num. serie do volume do HD em tenho, mas na verdade eu queo o nº de serie do HD q vem registrado nele propriamente dito.
Agradeco a colaboração de todos, URGENTE :(
T+

Enviado: 24 Jan 2007 14:39
por Augusto
Se vc está se referindo ao N/S que está na "etiqueta" afixada no lado de fora do HD.... Acho muito difícil que vc consiga um programa prá ler esse número... até prq, salvo engano, aquela etiqueta é colocada na linha de montagem do HD e serve, entre outras coisas, pro fabricante identificar a autenticidade do produto sem que, necessariamente, ele tenha que ser instalado em alguma máquina...

Mais como tem "maluco" com resposta prá tudo nesse nosso Fórum... Vá em frente... Continue perguntando...

Re: Numero de Seria do HD

Enviado: 24 Jan 2007 16:06
por Maligno
reunix escreveu:alguem tem uma rotina pra capturar o Nº de serie do HD
Leia a thread a respeito da LIB WAPI. Ou, melhor ainda, baixe a LIB e leia o README que a acompanha (há algumas restrições de uso da função de leitura dos dados do HD).
Por meio dela você pode obter esse número de série de forma bem simples:

Código: Selecionar todos

? "Serial#: " + GetHDInfo()[2]
?
Download: http://buzinello.com/download/wapi.zip

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 06 Fev 2007 12:01
por keler clipper
Ola, td bem, tb sou novato aki.
Ja passei por esse tipo de problema e eh possivel resolver sem usar nenhuma biblioteca adicional. Veja o codigo seguinte:

// Keler Melo 44.9944-1535
// Retorna o numero de serie do hd
// Funcao para ms-dos e windows x.x
function vol_serial( cDisk )
local cScr, cCommand, nLen, cDiskName
local nHand, cBuffer, cPointer, nPointer, cSerial

// Inicializa variaveis
cScr := savescreen( 0,0,24,80 )
cCommand := 'vol > swap.tmp'
nLen := 9
cPointer := 'do volume'
nPointer := 0
cSerial := space( nLen )

// Trica o disco
cDiskName := DiskName()
if !DiskChange( cDisk ) // Clipper 5.3
return 'disk error'
end

// Verifica protecao de arquivo
if file( 'swap.tmp' )
delete file 'swap.tmp'
if file( 'swap.tmp' )
return 'file error: protection activated'
end
end

// Testa abertura do arquivo
run ( cCommand )
if !file( 'swap.tmp' )
return '-1 ( file not found )'
end
nHand := fopen( 'swap.tmp' )
if nHand < 0
return 'file error:' + ltrim( str( ferror() ) )
end
fclose( nHand )

// Testa leitura do arquivo
cBuffer := memoread( 'swap.tmp' )
if (cBuffer=="")
return 'file empty:' + ltrim( str( ferror() ) )
end
nPointer := at( cPointer, cBuffer ) + len( cPointer ) + 3
cSerial := substr( cBuffer, nPointer, 9 )

// Fecha recursos, retorna o disco e devolve o serial
delete file 'swap.tmp'
DiskChange( cDiskName )
restscreen( 0,0,24,80 )

return cSerial

Enviado: 06 Fev 2007 13:07
por Maligno
Ja passei por esse tipo de problema e eh possivel resolver sem usar nenhuma biblioteca adicional.
Infelizmente você está errado. É impossível resolver esse problema sem o uso de uma biblioteca adicional.
Releia a mensagem e note: nosso colega pediu o número de série de fábrica, não o da formatação, que é o o que seu código retorna. Número que aliás, nem é de serialização, mas de identificação. O DOS/Windows cria este número através de uma simples técnica de "scrambling".
E mesmo este número da formatação, há uma forma mais fácil através de uma simples função. Tenho na minha página, caso queira.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 07 Fev 2007 09:39
por keler clipper
:D Correto. Grato pelo programa. :D

Enviado: 13 Fev 2007 12:52
por diogenes_varela
Maligno escreveu:
O DOS/Windows cria este número através de uma simples técnica de "scrambling".
Amigo Maligno (que nome, heim?)

Sabe me dizer se há uma seqüência lógica na numeração, pois o mesmo muda a cada formatação.

Isso seria útil no caso do cliente formatar a máquina e o programa só liberar a reinstalação para o serial previsto.

Qto. a forma mais simples de obter o serial, na minha opinião é redirecionar o comando VOL do DOS para um arquivo de texto e depois extraí-lo, usando o comando MEMOREAD() do clipper.

Enviado: 13 Fev 2007 15:12
por Maligno
diogenes_varela escreveu:Amigo Maligno (que nome, heim?)
Não é o meu nome. É só um apelido.
Sabe me dizer se há uma seqüência lógica na numeração, pois o mesmo muda a cada formatação.
O algoritmo de "scrambling" utilizado pela Microsoft (logo abaixo) não utiliza qualquer tipo de seqüenciamento que não a data e hora. A lógica do "scrambler" é apenas e tão somente misturar esses dados, obtidos no momento da formatação.

Código: Selecionar todos

Get date (INT 21h, AH=2Bh)
Get time (INT 21h, AH=2Ch)
Serial_ID+0 = DX reg date + DX reg time
Serial_ID+2 = CX reg date + CX reg time
Serial_Num_Low = Serial_ID+2
Serial_Num_High = Serial_ID+0
Isso seria útil no caso do cliente formatar a máquina e o programa só liberar a reinstalação para o serial previsto.
Com base neste algoritmo do cálculo, impossível. Mas há outras formas, bem melhores, de revalidar um licenciamento.
Qto. a forma mais simples de obter o serial, na minha opinião é redirecionar o comando VOL do DOS para um arquivo de texto e depois extraí-lo, usando o comando MEMOREAD() do clipper.
Uma gambiarra pelo comando VOL não pode ser mais simples que GetVolSerN([<drive>]).
Conforme eu comentei, há um objeto na minha página que contém duas funções. A de leitura do serial, que funciona em qualquer Windows e em DOS puro, e a de escrita (SetVolSErN([<drive>],<serial>)), que só não funciona em kernel NT, claro.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 13 Fev 2007 20:12
por diogenes_varela
Caro amigo Maligno

Claro que sei que não é o seu nome, excuse-me...

Obrigado pelos esclarecimentos.

É que sempre quis bolar uma forma de vender um programa, o cliente instalar e, como sempre há o problema da formatação, controlar através de alguma informação originária da máquina, liberando a reinstalação somente na mesma.

Baixei o obj a que você se referiu. Só não entendo porque você acha mais simples do que um uma "gambira" com apenas duas linhas.

Enviado: 13 Fev 2007 23:50
por Maligno
Claro que sei que não é o seu nome, excuse-me...
Esclareci porque já houve quem me perguntasse se era meu nome. 8-)
É que sempre quis bolar uma forma de vender um programa
O assunto de proteção de programa é praticamente inesgotável. Se procurar, deve encontrar várias threads em que trataram desse assunto. Mas se quiser, abra um novo tópico para colher as opiniões dos colegas.
Baixei o obj a que você se referiu. Só não entendo porque você acha mais simples do que um uma "gambira" com apenas duas linhas.
Apenas duas linhas de código mas um razoável overhead para o programa, já que será necessário, primeiro fazer um swap do programa para a memória em disco ou RAM (dependendo do linker), e depois ainda invocar uma cópia do interpretador para que o VOL seja interpretado e executado. Ao final, restaurar a memória. Nada contra, até porque isso não é o fim do mundo. O próprio WAPI exige isso, se bem que para operações que realmente não podem ser feitas pelo Clipper.
Mas se você tem a oportunidade de economizar recursos com uma simples função, me parece claro que o uso do comando RUN (ou SwpRunCmd(), conforme o caso) não só desperdiça recursos como também acrescenta uma complexidade desnecessária. Sem falar que o retorno da função ainda pode ser utilizada dentro de uma expressão complexa ou mesmo ser atribuída diretamente a um campo/variável.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 14 Fev 2007 12:18
por diogenes_varela
Uma discussão em tão alto nível é realmente enriquecedora! Obrigado. Sugestão do tópico aceita. Já foi criado.

Você me fez lembrar que no caso da reinstalação não há tanto que se preocupar com o tamanho da carga, isso seria mais durante o uso do programa.

abraços.