论坛: 编程破解 标题: 急:谁有关于WINDOWS下查找磁盘序列号的源代码? 复制本贴地址    
作者: rain_night [rain_night]    论坛用户   登录
或者是其他机器硬件的源代码,最好是C写的。

地主 发表时间: 04-05-13 16:10

回复: yingzike [yingzike]   论坛用户   登录
/* ======================================= */
/*  读取硬盘内部出厂数据函数              */
/* ======================================= */

readser()
{
  unsigned int i,j;
  unsigned char p;
  unsigned int c,h,ss,cache=0;
  unsigned char s[21];
  unsigned char v[9];
  unsigned char t[41];
  i=0;j=0;p=0;

  clear1();
  HZcprintf(208,200,2,7,"正在读硬盘数据...");


  while(p!=0x40)
  {
    j++;
    if(j==0xffff) break;
    p=inportb(0x1f7);
    p&=0xc0;
  }
  outportb(0x3f6,0);
  for(i=0;i<5;i++) outportb(0x1f1+i,0);
  outportb(0x1f6,0xa0);
  outportb(0x1f7,0xec);
  i=0;j=0;p=0;
  while(p!=0x8)
  {
    j++;
    if(j==0xffff) break;
    p=inportb(0x1f7);
    p&=0x88;
  }
  j=inport(0x1f0);
  c=inport(0x1f0);
  j=inport(0x1f0);
  h=inport(0x1f0);
  j=inport(0x1f0);
  j=inport(0x1f0);
  ss=inport(0x1f0);
  for(i=0;i<3;i++) j=inport(0x1f0);
  for(i=0;i<11;i++)
  {
    j=inport(0x1f0);
    s[i*2]=(unsigned char)(j>>8);
    s[i*2+1]=(unsigned char)j;
  }
      cache=inport(0x1f0);
      cache=cache/2;

  j=inport(0x1f0);
  for(i=0;i<4;i++)
  {
    j=inport(0x1f0);
    v[i*2]=(unsigned char)(j>>8);
    v[i*2+1]=(unsigned char)j;
  }
  for(i=0;i<20;i++)
  {
    j=inport(0x1f0);
    t[i*2]=(unsigned char)(j>>8);
    t[i*2+1]=(unsigned char)j;
  }
  for(i=0;i<0xb9;i++)  j=inportb(0x1f7);

  i&=0x71;


  s[20]='\0';
  v[8]='\0';
  t[40]='\0';


  if(ss==65535&&c==65535)
  {
  HZcprintf(208,200,2,0,"正在读硬盘数据...");
  HZcprintf(180,240,2,15,"注意:硬盘读错误,按任意键退出...");
  getch();
  }
  else
  {
  HZcprintf(208,200,2,0,"正在读硬盘数据...");
  window(5,8,72,25);
  setcolor(7);
  line(220,165,375,165);
  HZcprintf(230,140,4,7,"◆查看硬盘参数");
  HZcprintf(20,175,1,7,"柱面数:");
  HZcprintf(20,205,1,7,"磁头数:");
  HZcprintf(20,235,1,7,"扇区数:");
  HZcprintf(200,205,1,7,"产品序列号:");
  HZcprintf(200,175,1,7,"缓冲区容量:");
  HZcprintf(200,235,1,7,"控制器版本:");
  HZcprintf(20,270,1,7,"控制器类型:");

  textcolor(15);
  gotoxy(10,5); cprintf("[%u C]",c);
  gotoxy(10,7); cprintf("[%u H]",h);
  gotoxy(10,9); cprintf("[%u S]",ss);
  gotoxy(42,5); cprintf("[%u K]",cache);
  gotoxy(42,7); cprintf("%-20s",s);
  gotoxy(42,9); cprintf("%-8s",v);
  gotoxy(13,11); cprintf("%-40s",t);
  getch();
  }
clear();
}

没事做,把以前的东东拿出来晒晒


做做好事,不灌水

B1层 发表时间: 04-05-13 18:12

回复: rain_night [rain_night]   论坛用户   登录
在什么下编译的?

B2层 发表时间: 04-05-13 18:51

回复: yingzike [yingzike]   论坛用户   登录
纯水(C)了

TC2.0

HZcprintf(230,140,4,7,"◆查看硬盘参数");是自己写的打印中文的函数,你改成其他的就行了



B3层 发表时间: 04-05-13 19:29

回复: rain_night [rain_night]   论坛用户   登录
恩 但我在WIN2K下执行时说不能读内存什么地址,也就是说得不到结果,怎么解决!

B4层 发表时间: 04-05-14 17:57

回复: yingzike [yingzike]   论坛用户   登录
晕,WIN2000下,你没有权限读的。
如果在2000下读,还不如看一看DISK32,有全部源程序,可惜不是纯C
又和你的问题不一样了


B5层 发表时间: 04-05-17 12:51

回复: 286 [unique]   版主   登录
GetVolumeInformation 
BOOL  GetVolumeInformation( 
  LPCTSTR  lpRootPathName,                      //  root  directory 
  LPTSTR  lpVolumeNameBuffer,                //  volume  name  buffer 
  DWORD  nVolumeNameSize,                        //  length  of  name  buffer 
  LPDWORD  lpVolumeSerialNumber,          //  volume  serial  number 
  LPDWORD  lpMaximumComponentLength,  //  maximum  file  name  length 
  LPDWORD  lpFileSystemFlags,                //  file  system  options 
  LPTSTR  lpFileSystemNameBuffer,        //  file  system  name  buffer 
  DWORD  nFileSystemNameSize                  //  length  of  file  system  name  buffer 
); 

B6层 发表时间: 04-05-18 09:07

回复: hackgou [hackgou]   论坛用户   登录
286兄的够精炼的,
我也来补充一段:

/******************************************************************
*                                                                *
*        FileNma: getSerNum.cpp                                  *
*        Des:  打印卷标号及相关信息,并返回对应序列号                *
*        cl getSerNum.cpp                                        *
*                                                                *
*                                                                *
*        Author:HackGou  Email:HackGou_AT_yeah_Dot_net          *
*        Blog:http://hackgou.blogbus.com                          *
******************************************************************/


#include <windows.h>
#include <iostream.h>

#define VOLNAMELEN MAX_PATH       
#define FILESYSNAMEBUFSIZE MAX_PATH


int main(int avgc,char * argn[])
{
char VolumeName[VOLNAMELEN];
char FileSysNameBuf[FILESYSNAMEBUFSIZE];
DWORD dwSysFlags;
DWORD VolSerNum;
DWORD MaxComLen;
GetVolumeInformation(argn[1], //需要检查的跟目录名称
VolumeName,             //卷名称
VOLNAMELEN, //卷名称长度
&VolSerNum, //序列号
&MaxComLen,            //最大的文件名长度
&dwSysFlags,            //文件系统类型
FileSysNameBuf,        //文件系统类型(NTFS或者FAT32)
FILESYSNAMEBUFSIZE);    //文件系统类型长度

cout<< "根目录: " << argn[1] << endl;
cout<< "卷名: "<< VolumeName << endl;
cout<< "序列号: "<< VolSerNum << endl;
cout<< "支持的最大文件名长度: "<< MaxComLen<< endl;
cout<< "文件系统类型: "<< FileSysNameBuf << endl;
return VolSerNum;

}

使用如下:
D:\My Documents\PGSC\cpp>getSerNum.exe c:\
根目录: c:\
卷名: SYS
序列号: 811629652
支持的最大文件名长度: 255
文件系统类型: NTFS

D:\My Documents\PGSC\cpp>getSerNum.exe d:\
根目录: d:\
卷名: DIG
序列号: 2214828414
支持的最大文件名长度: 255
文件系统类型: NTFS

B7层 发表时间: 04-05-18 10:42

回复: rain_night [rain_night]   论坛用户   登录
yingzike:为什么我在WIN98下编译的结果全是255但同样的程序在DOS下却是正确的 答案了?
也同样谢谢下面的朋友!

B8层 发表时间: 04-05-18 12:46

回复: rain_night [rain_night]   论坛用户   登录
iostream.h和windows.h哪有这两个头文件哦?

B9层 发表时间: 04-05-18 13:48

回复: hackgou [hackgou]   论坛用户   登录
iostream.h

windows.h
是windows下C++常用的两个头文件,前者用于io,后者则定义windows常见的一些函数和结构。
在代码的注释部分有些编译的说明:
cl getSerNum.cpp
也就是用命令行的VC编译器编译。

另外:GetVolumeInformation在头文件Winbase.h中声明;
但是只需include Windows.h.就可以使用了。


B10层 发表时间: 04-05-18 19:51

回复: rain_night [rain_night]   论坛用户   登录
但我还是没能在WINDOWS下调试成功,为什么?

B11层 发表时间: 04-05-20 17:05

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号