Usando C y ASM
Publicado: Mar Jun 20, 2006 5:24 am
Estoy queriendo pasar ua funcion que encontre entre mis cosas, la cual me sirve para leer la etqueta y la serie de un disco duro, pero, ya me atore por mucho rato.
Alguien podria ayudarme a corregirlo y ponerlo de nuevo en el foro, a mucho sppodria servirnos.
#pragma BEGINDUMP
#include "windows.h"
#include "xailer.h"
#include "winsock2.h"
// #include "extend.api"
#define AX_GETSERIAL 2150 //h0866
#define AX_SETSERIAL 2118 //h0846
#define UPPER ('a' - 'A')
#define islower(p) ( 'a' <= (p) && (p) <= 'z' )
#define toupper(p) ( islower(p) ? ((p) - UPPER) : ((p)) )
XA_FUNC( ZVOLUME )
{
WSADATA wsa;
char *name = (char *) hb_xgrab( 25 );
unsigned int iDrive = ISNUM(1) ? hb_parni(1) : 0 ;
int iCX = AX_GETSERIAL;
int iReturn = 0;
int iFree = 0;
if ISCHAR(1)
iDrive = toupper(hb_parc(1)[0]) - 64 ;
if (ISCHAR(2) && (hb_parclen(2) == 25) )
{
iCX = AX_SETSERIAL ;
name = hb_parc(2);
}
else
{
iFree = 1;
name = hb_xalloc(25) ;
}
//en lo que sigue marca error
_asm
{ push ds
push dx
push cx
lds dx, [name] ; load name address in DS:DX
mov AX,440Dh
mov BX,iDrive
mov CX,iCX
int 21h
JNC noerror
mov iReturn, AX
noerror:
pop cx
op dx
pop ds
}
hb_retc("");
if ( iReturn == 0 )
hb_retclen(name,25);
if (iFree)
{
WSACleanup();
hb_xfree(name);
}
}
#pragma ENDDUMP
Saludos.
--
Ramón Zea
ramonzea@yahoo.com
http://www.paginasprodigy.com/zeasoft/
--
Alguien podria ayudarme a corregirlo y ponerlo de nuevo en el foro, a mucho sppodria servirnos.
#pragma BEGINDUMP
#include "windows.h"
#include "xailer.h"
#include "winsock2.h"
// #include "extend.api"
#define AX_GETSERIAL 2150 //h0866
#define AX_SETSERIAL 2118 //h0846
#define UPPER ('a' - 'A')
#define islower(p) ( 'a' <= (p) && (p) <= 'z' )
#define toupper(p) ( islower(p) ? ((p) - UPPER) : ((p)) )
XA_FUNC( ZVOLUME )
{
WSADATA wsa;
char *name = (char *) hb_xgrab( 25 );
unsigned int iDrive = ISNUM(1) ? hb_parni(1) : 0 ;
int iCX = AX_GETSERIAL;
int iReturn = 0;
int iFree = 0;
if ISCHAR(1)
iDrive = toupper(hb_parc(1)[0]) - 64 ;
if (ISCHAR(2) && (hb_parclen(2) == 25) )
{
iCX = AX_SETSERIAL ;
name = hb_parc(2);
}
else
{
iFree = 1;
name = hb_xalloc(25) ;
}
//en lo que sigue marca error
_asm
{ push ds
push dx
push cx
lds dx, [name] ; load name address in DS:DX
mov AX,440Dh
mov BX,iDrive
mov CX,iCX
int 21h
JNC noerror
mov iReturn, AX
noerror:
pop cx
op dx
pop ds
}
hb_retc("");
if ( iReturn == 0 )
hb_retclen(name,25);
if (iFree)
{
WSACleanup();
hb_xfree(name);
}
}
#pragma ENDDUMP
Saludos.
--
Ramón Zea
ramonzea@yahoo.com
http://www.paginasprodigy.com/zeasoft/
--