FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ayuda Funciones a Bajo Nivel
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Ayuda Funciones a Bajo Nivel
Posted: Mon May 05, 2014 12:55 PM
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:


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..
Soluciones y DiseƱo de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y DiseƱador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon May 05, 2014 01:32 PM
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon May 05, 2014 03:00 PM
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..
Soluciones y DiseƱo de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y DiseƱador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Tue May 06, 2014 12:15 PM

oSistema := objWMI:ExecQuery("Select * from Win32_PhysicalMedia")

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

Johnson russi

Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Tue May 06, 2014 10:24 PM
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..



Qué estare haciendo mal..? Alguna solución..
Soluciones y DiseƱo de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y DiseƱador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Sun Jun 08, 2014 06:12 PM

Retomando el tema, nadie ha probado trabajar con este dato del disco duro..?

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

Saludos..

Soluciones y DiseƱo de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y DiseƱador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Sun Jun 08, 2014 07:03 PM

Has probado a usar MsgInfo( nSerialHD() ) ?

viewtopic.php?p=159802#p159802

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon Jun 09, 2014 12:00 AM
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 (fw): Select all Collapse
#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..
Soluciones y DiseƱo de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y DiseƱador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon Jun 09, 2014 06:11 AM
Victor,

Tienes que escribir LONG en minĆŗsculas:

Code (fw): Select all Collapse
#pragma BEGINDUMP

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

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

Antonio Linares
www.fivetechsoft.com
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon Jun 09, 2014 12:56 PM
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..
Soluciones y DiseƱo de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y DiseƱador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon Jun 09, 2014 01:29 PM

Victor,

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

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon Jun 09, 2014 02:42 PM
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..
Soluciones y DiseƱo de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y DiseƱador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon Jun 09, 2014 02:49 PM

Victor,

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

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon Jun 09, 2014 03:42 PM
Soluciones y DiseƱo de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y DiseƱador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda Funciones a Bajo Nivel
Posted: Mon Jun 09, 2014 05:03 PM
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 (fw): Select all Collapse
#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
regards, saludos

Antonio Linares
www.fivetechsoft.com