Ayuda Funciones a Bajo Nivel

Ayuda Funciones a Bajo Nivel

Postby cuatecatl82 » 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:
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..
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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Ayuda Funciones a Bajo Nivel

Postby karinha » Mon May 05, 2014 1:32 pm

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7872
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Ayuda Funciones a Bajo Nivel

Postby cuatecatl82 » Mon May 05, 2014 3: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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Ayuda Funciones a Bajo Nivel

Postby russimicro » 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
russimicro
 
Posts: 262
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Ayuda Funciones a Bajo Nivel

Postby cuatecatl82 » 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..

Image

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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Ayuda Funciones a Bajo Nivel

Postby cuatecatl82 » Sun Jun 08, 2014 6: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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Ayuda Funciones a Bajo Nivel

Postby Antonio Linares » Sun Jun 08, 2014 7:03 pm

Has probado a usar MsgInfo( nSerialHD() ) ?

viewtopic.php?p=159802#p159802
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda Funciones a Bajo Nivel

Postby cuatecatl82 » 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: Select all  Expand view  RUN
#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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Ayuda Funciones a Bajo Nivel

Postby Antonio Linares » Mon Jun 09, 2014 6:11 am

Victor,

Tienes que escribir LONG en minúsculas:

Code: Select all  Expand view  RUN
#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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda Funciones a Bajo Nivel

Postby cuatecatl82 » 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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Ayuda Funciones a Bajo Nivel

Postby Antonio Linares » Mon Jun 09, 2014 1:29 pm

Victor,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda Funciones a Bajo Nivel

Postby cuatecatl82 » Mon Jun 09, 2014 2: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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Ayuda Funciones a Bajo Nivel

Postby Antonio Linares » Mon Jun 09, 2014 2: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda Funciones a Bajo Nivel

Postby cuatecatl82 » Mon Jun 09, 2014 3: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
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Ayuda Funciones a Bajo Nivel

Postby Antonio Linares » Mon Jun 09, 2014 5: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: Select all  Expand view  RUN
#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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 101 guests