Miércoles 5 de Febrero de 2025, 12:49
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
»
Visual C++
(Moderador:
Eternal Idol
) »
Como modificar este código VC++...
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Como modificar este código VC++... (Leído 1738 veces)
gayo1100
Nuevo Miembro
Mensajes: 3
Como modificar este código VC++...
«
en:
Lunes 2 de Febrero de 2009, 10:29 »
0
Hola, buscando en la web encontré un código para cambiar el numero de serie del disco duro, he intentado modificarlo para que cambie el numero de serie en dos discos duros a la vez, por ej. C: y D:, pero me da fallos, la verdad no soy experto en VC++ mis conocimientos son mas bién no amplios, lo he intentado pero nada de nada, agradecería a algún experto me hechara una mano.
Mi idea es que una vez que se ejecute el archivo (archivo.cpp), que se vuelva a ejecutar otra vez el mismo codigo en otro archivo (archivo2.cpp)-->este seria para D: , pero cuando he probrado a insertar en el proyecto (archivo2.cpp) da fallos...
El proyecto consta de : archivo.cpp, cabecera.h, cabecera.cpp
Muchas gracias de antemano.
los archivos (*.h) no estan, pero el principal (archivo.cpp) es :
///////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
void ShowErrorString(char *str)
{
printf(str);
}
void ChangeSerialNumber(DWORD Drive, const DWORD newSerial)
{
DiskSector disk;
const max_pbsi = 1;
struct partial_boot_sector_info
{
LPSTR Fs;
DWORD FsOffs;
DWORD SerialOffs;
};
partial_boot_sector_info pbsi[max_pbsi] =
{
{"NTFS",0x48}
};
TCHAR szDrive[12];
char Sector[512];
DWORD i;
sprintf(szDrive, "%c:\", Drive & 0xFF);
if (!disk.Open(szDrive))
{
ShowErrorString("No se puede abrir el disco !");
return;
}
// read sector
if (!disk.ReadSector(0, Sector))
{
ShowErrorString("No se puede leer el sector!");
return;
}
// try to search for a valid boot sector
for (i=0;i<max_pbsi;i++)
{
if (strncmp(pbsi.Fs, Sector+pbsi.FsOffs, strlen(pbsi.Fs)) == 0)
{
// we found a valid signature
break;
}
}
// patch serial number
*(PDWORD)(Sector+pbsi.SerialOffs) = newSerial;
// write boot sector
if (!disk.WriteSector(0, Sector))
{
ShowErrorString("No se puede escribir el sector!");
return;
}
ShowErrorString("Cambio realizado !");
}
int main(int argc, char **argv)
{
if (argc < 3)
{
ChangeSerialNumber('C', 0x12345678); // aqui cambia en C:
return 0;
}
DWORD n;
char *temp;
n = strtol((const char *)argv[2], &temp, 16);
ChangeSerialNumber(toupper(argv[1][0]), n);
return 0;
}
//////////////////////////////////////////////////////////
Tweet
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Como modificar este código VC++...
«
Respuesta #1 en:
Lunes 2 de Febrero de 2009, 16:38 »
0
Hola gayo1100, te aconsejo que uses las etiquetas de código cuando pongas código.
Este programa ya puede cambiar el número de serie de cualquier unidad que le especifiques. Sólo tienes que pasárselo por argumentos. Te explico un poco:
Fíjate que la función
main()
está hecha para recibir argumentos de entrada:
argc
te da el número de argumentos y
argv[]
los argumentos como cadenas de caracteres.
Código: C
if
(
argc
<
3
)
{
ChangeSerialNumber
(
'C'
,
0x12345678
)
;
// aqui cambia en C:
return
0
;
}
Sólo si los argumentos son menores que 3 se ejecuta el cambio que comentas: el número de serie del lector C: a 0x12345678.
Fíjate ahora en este parte del código:
Código: Text
n = strtol((const char *)argv[2], &temp, 16);
ChangeSerialNumber(toupper(argv[1][0]), n);
En la primera sentencia, el segundo argumento pasado al programa (char *argv[2]) se convierte a
DWORD n
, es decir, una cadena de caracteres a un número de 32 bits (como 0x12345678).
Ahora si nos fijamos en la segunda sentencia y vemos qué valores se pasan a
ChangeSerialNumber(DWORD Drive, const DWORD newSerial)
, vemos que
argv[1][0]
corresponde a un tipo char (como
'C'
en la anterior llamada), así que el primer argumento es la letra del lector. El segundo parámetro es
n
, que corresponde al segundo argumento
argv[2]
(como 0x12345678 en la otra llamada).
Así que, si tu programa fuera
changeserial.exe
, podrías poner
changeserial d 0x03456765
para cambiar el serial del lector D: a 03456765.
Espero haberme explicado, cualquier duda me comentas. ¡Salud!
Fr33k K0mpu73r
gayo1100
Nuevo Miembro
Mensajes: 3
Re: Como modificar este código VC++...
«
Respuesta #2 en:
Miércoles 4 de Febrero de 2009, 09:45 »
0
Muchas gracias mosquito por tu respuesta, pero creo que me he explicado mal, he estado haciendo lo que me dices y estupendo..., he realizado algunos cambios y funciona, pero con demasiado codigo, me explico...
No se como simplificar o realizar un bucle de n veces que yo quiera, minimizar tener que poner dos veces lo mismo.
Esta
Código: C++
void
ChangeSerialNumber
(
DWORD Drive,
const
DWORD newSerial
)
Vale, lo que hago es poner dos veces el contenido de este
Código: C++
void
ChangeSerialNumber2
(
DWORD Drive,
const
DWORD newSerial
)
//aqui cambio a ChangeSerialNumber2
Ahora te adjunto el resultado final para FAT16 probado en USB PENDRIVE
Código: C++
///////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
void
ShowErrorString
(
char
*
str
)
{
printf
(
str
)
;
}
void
ChangeSerialNumber
(
DWORD Drive,
const
DWORD newSerial
)
{
DiskSector disk
;
const
max_pbsi
=
1
;
struct
partial_boot_sector_info
{
LPSTR Fs
;
DWORD FsOffs
;
DWORD SerialOffs
;
}
;
partial_boot_sector_info pbsi
[
max_pbsi
]
=
{
{
"FAT"
,
0x27
}
//Direccion para numero de serie en FAT16 PENDRIVE USB
}
;
TCHAR szDrive
[
12
]
;
char
Sector
[
512
]
;
DWORD i
;
sprintf
(
szDrive,
"%c:
\"
, Drive & 0xFF);
if (!disk.Open(szDrive))
{
ShowErrorString("
No se puede abrir el disco
!
");
return;
}
// read sector
if (!disk.ReadSector(0, Sector))
{
ShowErrorString("
No se puede leer el sector
!
");
return;
}
// try to search for a valid boot sector
for (i=0;i<max_pbsi;i++)
{
if (strncmp(pbsi.Fs, Sector+pbsi.FsOffs, strlen(pbsi.Fs)) == 0)
{
// we found a valid signature
break;
}
}
// patch serial number
*(PDWORD)(Sector+pbsi.SerialOffs) = newSerial;
// write boot sector
if (!disk.WriteSector(0, Sector))
{
ShowErrorString("
No se puede escribir el sector
!
");
return;
}
ShowErrorString("
Cambio realizado
!
");
}
}
//////////////////////////////////////////////////////////////////////////////////////
AQUI CONTINUA EL MISMO CODIGO PERO CAMBIANDO ChangeSerialNumber a ChangeSerialNumber2
puesto que vamos a cambiar en direccion diferente para el cambio de etiqueta
//////////////////////////////////////////////////////////////////////////////////////
void ChangeSerialNumber2(DWORD Drive, const DWORD newSerial)
{
DiskSector disk;
const max_pbsi = 1;
struct partial_boot_sector_info
{
LPSTR Fs;
DWORD FsOffs;
DWORD SerialOffs;
};
partial_boot_sector_info pbsi[max_pbsi] =
{
{"
FAT
",0x2B} //0X2B Direccion para etiqueta disco
};
TCHAR szDrive[12];
char Sector[512];
DWORD i;
sprintf(szDrive, "
%
c
:
\
", Drive & 0xFF);
if (!disk.Open(szDrive))
{
ShowErrorString("
No se puede abrir el disco
!
");
return;
}
// read sector
if (!disk.ReadSector(0, Sector))
{
ShowErrorString("
No se puede leer el sector
!
");
return;
}
// try to search for a valid boot sector
for (i=0;i<max_pbsi;i++)
{
if (strncmp(pbsi.Fs, Sector+pbsi.FsOffs, strlen(pbsi.Fs)) == 0)
{
// we found a valid signature
break;
}
}
// patch serial number
*(PDWORD)(Sector+pbsi.SerialOffs) = newSerial;
// write boot sector
if (!disk.WriteSector(0, Sector))
{
ShowErrorString("
No se puede escribir el sector
!
");
return;
}
ShowErrorString("
Cambio realizado
!
");
}
int main(int argc, char **argv)
{
if (argc < 3)
{
ChangeSerialNumber('G', 0x12345678); // aqui cambia numero de serie G: usb pendrive FAT16
ChangeSerialNumber2('G', 0xJONATHAN); // aqui cambia la etiqueta volumen G: usb pendrive FAT16
return 0;
}
}
Es exactamente lo mimo pero cambia la direccion donde se va a modificar, cambia aqui:
Código: C++
En el primer
void
ChangeSerialNumber
(
DWORD Drive,
const
DWORD newSerial
)
partial_boot_sector_info pbsi
[
max_pbsi
]
=
{
{
"FAT"
,
0x27
}
//0X27 Direccion para numero de serie
}
;
Y en el segundo
void
ChangeSerialNumber2
(
DWORD Drive,
const
DWORD newSerial
)
partial_boot_sector_info pbsi
[
max_pbsi
]
=
{
{
"FAT"
,
0x2B
}
//0X2B Direccion para etiqueta disco
}
;
En resumen quiero simplificar esto y no se como hacer para hacerlo en un paso...te agradecería me orientaras.
Muchas gracias otra vez y un saludo.
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Como modificar este código VC++...
«
Respuesta #3 en:
Miércoles 4 de Febrero de 2009, 12:52 »
0
Por lo que he entendido,
ChangeSerialNumber2()
cambia la etiqueta y no el número de serie. Si es así, ponle un nombre más adecuado, tipo
CambiarEtiqueta()
.
Lo que no termino de entender es
0xJONATHAN
. Esto te tiene que dar un error como una casa...
Cita de: "gayo1100"
minimizar tener que poner dos veces lo mismo.
Entonces haz una sola función general que llame a dos funciones diferentes dependiendo de si es el número de serie o etiqueta tipo:
Código: C
void
ModificarDisco
(
DWORD Lector
,
UBYTE Modificar
,
DWORD NuevoValor
)
donde
Modificar
lleva un numero que indica qué modificar o y
NuevoValor
es un puntero al nuevo valor de modificación. Dentro de esta función compruebas
Modificar
y luego aplicas lo conveniente. Lo bueno de esto es que
ModificarDisco()
puede agrupar el código que tengan comunes ambas funciones, dejando
ChangeSerialNumber()
y
ChangeSerialNumber2()
con código distinto. Siempre aconsejo que las funciones sean lo más específicas y cortas posible.
Espero haberme explicado, saludos.
Fr33k K0mpu73r
gayo1100
Nuevo Miembro
Mensajes: 3
Re: Como modificar este código VC++...
«
Respuesta #4 en:
Miércoles 4 de Febrero de 2009, 13:54 »
0
Si efectivamente el valor de cambio etiqueta esta mal, me he equivocado, tiene que ir en formato hexadecimal..., el valor que asigno es JOSE como etiqueta de volumen que en hex = 0x4A4F5345, no entiendo muy bíen lo que dices de funcion general que llame a las dos funciones, no se como plantearla, demasiado para mi...gracias de todas formas por tu ayuda
y si puedes hacer algo te lo agradecería.
El codigo modificado resultante seria:
Código: C++
///////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
void
ShowErrorString
(
char
*
str
)
{
printf
(
str
)
;
}
void
ModificarDisco
(
DWORD Drive,
const
DWORD newSerial
)
{
DiskSector disk
;
const
max_pbsi
=
1
;
struct
partial_boot_sector_info
{
LPSTR Fs
;
DWORD FsOffs
;
DWORD SerialOffs
;
}
;
partial_boot_sector_info pbsi
[
max_pbsi
]
=
{
{
"FAT"
,
0x27
}
//Direccion hex. para numero de serie en FAT16 PENDRIVE USB
}
;
TCHAR szDrive
[
12
]
;
char
Sector
[
512
]
;
DWORD i
;
sprintf
(
szDrive,
"%c:
\"
, Drive & 0xFF);
if (!disk.Open(szDrive))
{
ShowErrorString("
No se puede abrir el disco
!
");
return;
}
// read sector
if (!disk.ReadSector(0, Sector))
{
ShowErrorString("
No se puede leer el sector
!
");
return;
}
// try to search for a valid boot sector
for (i=0;i<max_pbsi;i++)
{
if (strncmp(pbsi.Fs, Sector+pbsi.FsOffs, strlen(pbsi.Fs)) == 0)
{
// we found a valid signature
break;
}
}
// patch serial number
*(PDWORD)(Sector+pbsi.SerialOffs) = newSerial;
// write boot sector
if (!disk.WriteSector(0, Sector))
{
ShowErrorString("
No se puede escribir el sector
!
");
return;
}
ShowErrorString("
Cambio realizado
!
");
}
}
//////////////////////////////////////////////////////////////////////////////////////
AQUI CONTINUA EL MISMO CODIGO PERO CAMBIANDO a CambiarEtiqueta
//////////////////////////////////////////////////////////////////////////////////////
void CambiarEtiqueta(DWORD Drive, const DWORD newSerial)
{
DiskSector disk;
const max_pbsi = 1;
struct partial_boot_sector_info
{
LPSTR Fs;
DWORD FsOffs;
DWORD SerialOffs;
};
partial_boot_sector_info pbsi[max_pbsi] =
{
{"
FAT
",0x2B} //0X2B Direccion hex. para etiqueta disco
};
TCHAR szDrive[12];
char Sector[512];
DWORD i;
sprintf(szDrive, "
%
c
:
\
", Drive & 0xFF);
if (!disk.Open(szDrive))
{
ShowErrorString("
No se puede abrir el disco
!
");
return;
}
// read sector
if (!disk.ReadSector(0, Sector))
{
ShowErrorString("
No se puede leer el sector
!
");
return;
}
// try to search for a valid boot sector
for (i=0;i<max_pbsi;i++)
{
if (strncmp(pbsi.Fs, Sector+pbsi.FsOffs, strlen(pbsi.Fs)) == 0)
{
// we found a valid signature
break;
}
}
// patch serial number
*(PDWORD)(Sector+pbsi.SerialOffs) = newSerial;
// write boot sector
if (!disk.WriteSector(0, Sector))
{
ShowErrorString("
No se puede escribir el sector
!
");
return;
}
ShowErrorString("
Cambio realizado
!
");
}
int main(int argc, char **argv)
{
if (argc < 3)
{
ModificarDisco('G', 0x12345678); // -->valor =12345678 aqui cambia numero de serie G: usb pendrive FAT16
CambiarEtiqueta('G', 0x4A4F5345); // -->valor=JOSE -->aqui cambia la etiqueta volumen G: usb pendrive FAT16
return 0;
}
}
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
»
Visual C++
(Moderador:
Eternal Idol
) »
Como modificar este código VC++...