Page 1 of 3

Ayuda Funciones a Bajo Nivel

PostPosted: Mon May 05, 2014 12:55 pm
by cuatecatl82
Saludos foro:

Despues de un buen rato, regreso de nuevo al foro para solicitarles su valiosa cooperación:

Me encuentro ante la necesidad de obtener datos de discos duros, concretamente el Firmware y el Número de serie Fisico que traen de fabrica, ya hemos hablado anteriormente que mediante WMI es posible obtener muchos datos, pero en especifico estos dos son los que me hacen falta, he leido y buscado por muchos lados y no doy con el dato.

Necesito algo asi:
Image

Curiosamente me comentaban que se puede desde WMI o programando en C++, la primera opcion me es mas facil pues creo que los datos estan en la clave ("SELECT * FROM Win32_PhysicalMedia") pero no muestra nada excepto la etiqueta "TAG" = \\.\ PHYSICALDRIVE0, lo mismo pasa con WMIExplorer en windows XP.

http://savecomm.net/boards/topic/5/obtener-n%C3%BAmero-de-serie-disco-duro

Alguien sabe como agregar la referencia a System.Management.dll para que funcione, esto lo lei aqui:
http://social.msdn.microsoft.com/Forums/es-ES/aa244dfa-caaa-4401-a01f-fb38554e8c5b/obtener-n-serie-fisico-del-disco-duro-con-diskdrivephysicalmedia?forum=vbes

La otra opcion más ruda es traducir el codigo de C++ a Harbour, los archivos fuente esta aqui:
http://crystalmark.info/?lang=en.

Pues son funciones que trabajan a muy bajo nivel.

Hay pocos ejemplos en la red yencontre esto que es bastante valioso.

Alguien podria auxiliarme, se los agradecere bastante... Saludos..

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon May 05, 2014 1:32 pm
by karinha

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon May 05, 2014 3:00 pm
by cuatecatl82
João Santos:

Si estos ejemplos ya los revise pero san el numero de serie de Volumen, no el de fabricante..

Lo que necesito es más a bajo nivel..
Chequen los fuentes de este proyecto, trate de entenderle pero no tengo tantos conocimientos...
http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fcrystaldiskinfo%2F59798%2FCrystalDiskInfo6_1_12Src.zip
Gracias..

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Tue May 06, 2014 12:15 pm
by russimicro
oSistema := objWMI:ExecQuery("Select * from Win32_PhysicalMedia")

FOR Each oDatos In oSistema
MsgInfo("Serial de fabrica: " + ALLTRIM((oDatos:SerialNumber)),"")
exit
NEXT

Johnson russi

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Tue May 06, 2014 10:24 pm
by cuatecatl82
Foro buenas tardes:

Regresando al tema, y sobre a todo agradeciendo a los compañeros que amablemente se han comunicado conmigo en las redes sociales y los que han posteado aqui en el foro, Gracias.

Investigando el asunto mediante WMI en XP SP3 no funciona, Al explorar las consultas con WMI Explorer "Win32_DiskDrive" muestra los campos vacios, pues la solicitud al Query en los metodo SerialNumber y FirmwareRevision no las detecta y la deja en blanco, esto hace mandar Error a mi Aplicación y truena.

Error description: (DOS Error -2147352570) WINOLE/1009 No existe el m‚todo: SERIALNUMBER
Error description: (DOS Error -2147352570) WINOLE/1009 No existe el m‚todo: FIRMWAREREVISION


Es por eso que intento basarme en funciones de bajo nivel en C para obtener estos datos..


La otra:
Instale Windows 7 Ultimate para probar y funciona mas o menos bien.

Aqui los metodos si devuelven valores, FirmwareRevision es correcto, pero no asi SerialNumber que muestra una cadena en Hexadecimal, lo extraño es que al pasarlo a String con la Funcion Hex2Str(oDrive:SerialNumber) muestra la serie del Disco pero las letras las cambia de lugar, la imagen dice mas que mil palabras..

Image

Qué estare haciendo mal..? Alguna solución..

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Sun Jun 08, 2014 6:12 pm
by cuatecatl82
Retomando el tema, nadie ha probado trabajar con este dato del disco duro..?

Alguna funcion en C que permita esta información..?

Saludos..

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Sun Jun 08, 2014 7:03 pm
by Antonio Linares
Has probado a usar MsgInfo( nSerialHD() ) ?

viewtopic.php?p=159802#p159802

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon Jun 09, 2014 12:00 am
by cuatecatl82
Maestro Antonio:

Buenas tardes le agradesco que haya revisado mi mensaje, la funcion nSerialHd() que comenta ya la habia probado pero siempre me da valores diferentes y en negativo, he revisado este link que no puedo complilar me manda error:

http://forums.fivetechsupport.com/viewtopic.php?f=3&t=13415&hilit=nSerialHD

La funcion en C NoSing() da error:
Error E2293 TestLvw.prg 209: ) expected in function HB_FUN_NOSIGN
*** 1 errors in Compile ***


Code: Select all  Expand view
#pragma BEGINDUMP

#include <Windows.h>
#include <HBApi.h>

HB_FUNC( NOSIGN )
{
   hb_retnll( ( unsigned LONG ) hb_parnl( 1 ) );
}
#pragma ENDDUMP


Lo que necesito es mas a bajo nivel, pues necesito obtener valores del SMART del disco duro algo como en este post:
http://forums.fivetechsupport.com/viewtopic.php?f=3&t=4412&hilit=nSerialHD
http://www.codeproject.com/Articles/16671/Hard-drive-information-using-S-M-A-R-T

Necesito obtener el Serial Fisico de Fabrica y el Firmware del disco.. Ojala haya algun codigo en C para estos datos..

Saludos y Gracias..

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon Jun 09, 2014 6:11 am
by Antonio Linares
Victor,

Tienes que escribir LONG en minúsculas:

Code: Select all  Expand view
#pragma BEGINDUMP

#include <Windows.h>
#include <HBApi.h>

HB_FUNC( NOSIGN )
{
   hb_retnll( ( unsigned long ) hb_parnl( 1 ) );
}
#pragma ENDDUMP

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon Jun 09, 2014 12:56 pm
by cuatecatl82
Gracias Maestro:

La correción funciona, pero devuelve lo mismo que muchas funciones VolumeSerialNumber que es el que se asigna al formatear el disco, yo necesito obtener el serial de Fabrica y el firmware, he buscado en muchos lados y es increible que no haya codigo en C que me devuelva estos valores..

Es tan dificil obtener estos dos datos, WMI no me retorna estos datos en XP, en W7 si pero con error, desconosco si W8 funcione... Tengo una dll demo GetDiskSerial.DLL 5.00 que si me da estos valores en XP y W7 pero no quiero depender de ella, quiero hacerlo de forma nativa desde mi sistema

Alguien más con conocimientos en C o C++ que me de una idea..

Aqui algo de Información:
http://www.forosdelweb.com/f14/obtener-n-serie-del-disco-duro-vb-6-a-241535/
http://www.compartir-tecnologias.es/respuesta/sacar-el-serial-fisico-del-disco-duro-ayuda-206931652.html
http://social.msdn.microsoft.com/forums/es-ES/4cd0af96-3c4b-4cc2-8e63-a0a42a6a4614/nmero-serie-del-disco-duro
http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html
http://www.clubdelphi.com/foros/showthread.php?t=79284
http://msmvps.com/blogs/peplluis/archive/2008/07/28/todo-lo-que-quise-saber-de-mi-disco-y-no-me-atrev-237-a-preguntarlo.aspx

Saludos y gracias de nuevo..

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon Jun 09, 2014 1:29 pm
by Antonio Linares
Victor,

De donde se puede descargar GetDiskSerial.DLL 5.00 ? Es libre ?

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon Jun 09, 2014 2:42 pm
by cuatecatl82
Es de Pago, la version demo esta aqui:

http://www.devlib.net/getdiskserial.htm

He logrado traducirla a Harbour y usarla con Fivewin
http://www.mediafire.com/?r42qlo947h5vq

Pero no quiero depender de esta dll, en Windows Vista si lo hace de forma nativa pero lo hace mal... Pienso que de forma a mas bajo nivel como C si se puede pero no hay codigo disponible..

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon Jun 09, 2014 2:49 pm
by Antonio Linares
Victor,

De la carpeta que has compartido cual es el fichero de la DLL ? Solo quiero echarle una ojeada :-)

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon Jun 09, 2014 3:42 pm
by cuatecatl82

Re: Ayuda Funciones a Bajo Nivel

PostPosted: Mon Jun 09, 2014 5:03 pm
by Antonio Linares
Victor,

Por favor añade este código al final del PRG principal de tu aplicación y llama a la función Test() y dime que te aparece, gracias

Code: Select all  Expand view
#pragma BEGINDUMP

#include <Windows.h>

HB_FUNC( TEST )
{
   HANDLE disk0;
   DWORD retCount;
   GETVERSIONINPARAMS versionInfo;

   /* get a handle for physical disk 0 (the C: drive) */
   if ((disk0 = CreateFile (
      "\\\\.\\PHYSICALDRIVE0",
      GENERIC_READ | GENERIC_WRITE,
      FILE_SHARE_DELETE | FILE_SHARE_READ |
      FILE_SHARE_WRITE,
      NULL,
      OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      NULL)) == INVALID_HANDLE_VALUE)
   {
      MessageBox( 0, "1", "Info", 0 );
      return;
   }

   /* query the drive for the SMART version it supports */
   if (! (DeviceIoControl (disk0,
      SMART_GET_VERSION,
      NULL,
      0,
      &versionInfo,
      sizeof (GETVERSIONINPARAMS),
      &retCount,
      NULL)))
   {
      MessageBox( 0, "DeviceIoControl() call failed\n", "Info", 0 );
      return ;
   }

   /*
printf ("Driver version... %1d\n"
"Revision......... %1d\n"
"Device map....... 0x%02x\n"
"Capabilities......0x%02x\n",
versionInfo.bVersion,
versionInfo.bRevision,
versionInfo.bIDEDeviceMap,
versionInfo.fCapabilities);
*/


/* close everything & go home */
CloseHandle (disk0);
}

#pragma ENDDUMP