VC++实现U盘开机锁

8 篇文章 0 订阅
  1. #include <windows.h> 
  2. #include <winioctl.h> 
  3. #include <stdio.h> 
  4. #include <initguid.h> 
  5. #include <setupapi.h> 
  6. #include <string.h> 
  7.  
  8.  
  9. #define MAX_DEVICE 256 
  10. wchar_t USBSerial[5][100] = {TEXT("")}; 
  11. int gTag = 0; 
  12. DEFINE_GUID(UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed); 
  13. // SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大 
  14. #define INTERFACE_DETAIL_SIZE    (1024) 
  15. // IOCTL控制码 
  16. #define IOCTL_STORAGE_QUERY_PROPERTY   CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) 
  17.  
  18. #pragma comment(lib,"setupapi.lib") 
  19.  
  20.  
  21. //自动关机函数 
  22. void ExitWindowsCode() 
  23. {    
  24.     OSVERSIONINFO   stOSVI;    
  25.     ZeroMemory(&stOSVI   ,   sizeof   (   OSVERSIONINFO   ))   ;    
  26.     stOSVI.dwOSVersionInfoSize   =   sizeof   (   OSVERSIONINFO   )   ;    
  27.     if (!GetVersionEx   (   &stOSVI   ))   return;    
  28.              
  29.     if ( ( VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId ) && (  4  <= stOSVI.dwMajorVersion ) )    
  30.     {    
  31.        HANDLE   hToken;        
  32.        TOKEN_PRIVILEGES   tkp;        
  33.        if   (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,   &hToken))        
  34.          return;    
  35.       // Get the LUID for the shutdown privilege.        
  36.       LookupPrivilegeValue(NULL,   SE_SHUTDOWN_NAME,   &tkp.Privileges[0].Luid);        
  37.      
  38.       tkp.PrivilegeCount   =   1;   //   one   privilege   to   set        
  39.       tkp.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;        
  40.       AdjustTokenPrivileges(hToken,   FALSE,   &tkp,   0,(PTOKEN_PRIVILEGES)NULL,   0);        
  41.      
  42.       if   (GetLastError()   !=   ERROR_SUCCESS)        
  43.         return;    
  44.      
  45.       if   (!ExitWindowsEx(EWX_SHUTDOWN   |   EWX_FORCE|EWX_POWEROFF,   0))        
  46.         return;    
  47.      
  48.      }    
  49.      else//WIN9X    
  50.      { 
  51.          ExitWindowsEx(EWX_SHUTDOWN   |   EWX_FORCE   |   EWX_POWEROFF,   0);//   关机    
  52.      }  
  53.  
  54. // 根据GUID获得设备路径,用来判断U盘设备 
  55. // lpGuid: GUID指针 
  56. // pszDevicePath: 设备路径指针的指针 
  57. // 返回: 成功得到的设备路径个数,可能不止1个 
  58. int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath) 
  59.     HDEVINFO hDevInfoSet;    //设备信息集句柄; 
  60.     SP_DEVICE_INTERFACE_DATA ifdata; 
  61.     PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail; 
  62.     int nCount; 
  63.     BOOL bResult; 
  64.  
  65.     // 取得一个该GUID相关的设备信息集句柄 
  66.     hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&UsbClassGuid,     // class GUID  
  67.         NULL,                    // 无关键字 
  68.         NULL,                    // 不指定父窗口句柄 
  69.         DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的设备 
  70.  
  71.     // 失败... 
  72.     if (hDevInfoSet == INVALID_HANDLE_VALUE) 
  73.     { 
  74.       return 0; 
  75.     } 
  76.  
  77.     // 申请设备接口数据空间 
  78.     pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE); 
  79.  
  80.     pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 
  81.  
  82.     nCount = 0; 
  83.     bResult = TRUE; 
  84.  
  85.     // 设备序号=0,1,2... 逐一测试设备接口,到失败为止 
  86.     while (bResult) 
  87.     { 
  88.         ifdata.cbSize = sizeof(ifdata); 
  89.  
  90.         // 枚举符合该GUID的设备接口 
  91.         bResult = ::SetupDiEnumDeviceInterfaces( 
  92.             hDevInfoSet,     // 设备信息集句柄 
  93.             NULL,            // 不需额外的设备描述 
  94.             lpGuid,          // GUID 
  95.             (ULONG)nCount,   // 设备信息集里的设备序号 
  96.             &ifdata);        // 设备接口信息 
  97.  
  98.         if (bResult) 
  99.         { 
  100.             // 取得该设备接口的细节(设备路径) 
  101.             bResult = SetupDiGetInterfaceDeviceDetail( 
  102.                 hDevInfoSet,    // 设备信息集句柄 
  103.                 &ifdata,        // 设备接口信息 
  104.                 pDetail,        // 设备接口细节(设备路径) 
  105.                 INTERFACE_DETAIL_SIZE,   // 输出缓冲区大小 
  106.                 NULL,           // 不需计算输出缓冲区大小(直接用设定值) 
  107.                 NULL);          // 不需额外的设备描述 
  108.             if (bResult) 
  109.             { 
  110.                 // 复制设备路径到输出缓冲区 
  111.                 wcscpy_s(pszDevicePath[nCount],wcslen(pDetail->DevicePath)+1, pDetail->DevicePath); 
  112.                // 调整计数值 
  113.                 nCount++; 
  114.             } 
  115.         } 
  116.     } 
  117.     // 释放设备接口数据空间 
  118.     ::GlobalFree(pDetail); 
  119.     // 关闭设备信息集句柄 
  120.     ::SetupDiDestroyDeviceInfoList(hDevInfoSet); 
  121.    return nCount; 
  122.  
  123. // 返回U盘设备句柄 hDevice 
  124. HANDLE OpenDevice(wchar_t* DevicePath) 
  125.     HANDLE hDevice; 
  126.     hDevice = CreateFileW(DevicePath, 
  127.         GENERIC_READ && GENERIC_WRITE, 
  128.         FILE_SHARE_READ && FILE_SHARE_WRITE, 
  129.         NULL, 
  130.         OPEN_EXISTING, 
  131.         0, 
  132.         NULL); 
  133.     return hDevice; 
  134.  
  135. int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)  
  136.     int i, nDevice; // nDevice 表示有多少个USB设备 
  137.     int ndevice = 0; // 表示多少个U盘设备(可进行读写的设备) 
  138.     wchar_t* szDevicePath[MAX_DEVICE];        // 设备路径 
  139.     HANDLE hDevice; 
  140.  
  141.     // DWORD dwOutBytes; // IOCTL输出数据长度 
  142.     // 定义一个 PSTORAGE_DEVICE_DESCRIPTOR 变量,存放设备属性 
  143.     PSTORAGE_DEVICE_DESCRIPTOR DeviceDesc; 
  144.     // 变量初始化 
  145.     DeviceDesc=(PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1]; 
  146.     DeviceDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1; 
  147.  
  148.     // 分配需要的空间 
  149.     for (i = 0; i < MAX_DEVICE; i++) 
  150.     { 
  151.         szDevicePath[i] = new wchar_t[256]; 
  152.     } 
  153.  
  154.     // 取设备路径 
  155.     nDevice = ::GetDevicePath((LPGUID)&UsbClassGuid, szDevicePath); 
  156.  
  157.  
  158.     // 逐一获取设备信息 
  159.     for (i = 0; i < nDevice; i++) 
  160.     { 
  161.         // 打开设备 
  162.         hDevice = OpenDevice(szDevicePath[i]); 
  163.       
  164.         if (hDevice != INVALID_HANDLE_VALUE) 
  165.         { 
  166.             for(int j = 0; j < 4; j++) 
  167.             { 
  168.                 USBSerial[ndevice][j] = szDevicePath[i][j+12];  
  169.             } 
  170.             for(int j = 4; j < 28; j++) 
  171.             { 
  172.                 USBSerial[ndevice][j] = szDevicePath[i][j+22];  
  173.             } 
  174.             //printf("U盘序列号为:"); 
  175.             //wprintf(L"%ws\n", USBSerial[ndevice]); 
  176.             ndevice ++; 
  177.       
  178.             ::CloseHandle(hDevice); 
  179.          } 
  180.          
  181.  
  182.     }  
  183.  
  184.     // 释放空间 
  185.     for (i = 0; i < MAX_DEVICE; i++) 
  186.     { 
  187.         delete []szDevicePath[i]; 
  188.     } 
  189.  
  190. // 文件操作  
  191. HANDLE hFile;  
  192. DWORD nBytesRead = 0, dwBytesWritten = 0; 
  193.  
  194.      
  195.     
  196.  
  197. // 打开文件 
  198. hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"),    // file to open 
  199.                    GENERIC_READ | GENERIC_WRITE,          // open for reading 
  200.                    FILE_SHARE_READ | FILE_SHARE_WRITE,       // share for reading 
  201.                    NULL,                  // default security 
  202.                    OPEN_EXISTING ,         // existing file only 
  203.                    FILE_ATTRIBUTE_NORMAL, // normal file 
  204.                    NULL);                 // no attr. template 
  205. if (hFile != INVALID_HANDLE_VALUE) 
  206.     long nFileSize = GetFileSize(hFile, NULL); 
  207.     if (nFileSize == 0) 
  208.     { 
  209.         bool flag2 = CloseHandle(hFile); 
  210.          
  211.         if(::SetFileAttributes(TEXT("C:\\Windows\\system32\\USBID.ID"),FILE_ATTRIBUTE_NORMAL)) 
  212.         { 
  213.            if (DeleteFile(TEXT("C:\\Windows\\system32\\USBID.ID"))) 
  214.            { 
  215.                //MessageBox(NULL,TEXT("oo"),TEXT("oo"),MB_OK); 
  216.            } 
  217.         } 
  218.     } 
  219.  
  220.  
  221. // 打开文件 
  222. hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"),    // file to open 
  223.                    GENERIC_READ | GENERIC_WRITE,          // open for reading 
  224.                    FILE_SHARE_READ | FILE_SHARE_WRITE,       // share for reading 
  225.                    NULL,                  // default security 
  226.                    OPEN_EXISTING ,         // existing file only 
  227.                    FILE_ATTRIBUTE_NORMAL, // normal file 
  228.                    NULL);                 // no attr. template 
  229. if (hFile == INVALID_HANDLE_VALUE)  
  230.    hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"),     // file to create 
  231.                    GENERIC_READ | GENERIC_WRITE,          // open for writing 
  232.                    FILE_SHARE_READ | FILE_SHARE_WRITE,                      // do not share 
  233.                    NULL,                   // default security 
  234.                    CREATE_ALWAYS,          // overwrite existing 
  235.                    FILE_ATTRIBUTE_NORMAL | // normal file 
  236.                    FILE_ATTRIBUTE_NORMAL,   // asynchronous I/O 
  237.                    NULL);  
  238.    
  239. else 
  240.     if (ndevice < 1) 
  241.        { 
  242.            ExitWindowsCode(); 
  243.        } 
  244. long nFileSize = GetFileSize(hFile, NULL); 
  245. wchar_t   *tempbuf =   new   wchar_t[nFileSize]   ;  
  246. // 读文件内容 
  247. if (nFileSize == 0)  
  248. {  
  249.    // 创建文件,并把序列号写入文件中 
  250.    hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"),     // file to create 
  251.                    GENERIC_READ | GENERIC_WRITE,          // open for writing 
  252.                    FILE_SHARE_READ | FILE_SHARE_WRITE,                      // do not share 
  253.                    NULL,                   // default security 
  254.                    CREATE_ALWAYS,          // overwrite existing 
  255.                    FILE_ATTRIBUTE_NORMAL | // normal file 
  256.                    FILE_ATTRIBUTE_NORMAL,   // asynchronous I/O 
  257.                    NULL);                  // no attr. template 
  258.  
  259.    if (hFile == INVALID_HANDLE_VALUE)  
  260.     {  
  261.      return 0;  
  262.     } 
  263.    // 把序列号写入文件中 
  264.    WriteFile(hFile,  
  265.       USBSerial,  
  266.       2*wcslen(* USBSerial),  
  267.       &dwBytesWritten,  
  268.       NULL);  
  269.    nFileSize = GetFileSize(hFile, NULL); 
  270.  
  271.    if (nFileSize == 0) 
  272.    { 
  273.        bool flag1 = CloseHandle(hFile); 
  274.    } 
  275.    else 
  276.    { 
  277.        if (ndevice < 1) 
  278.        { 
  279.            ExitWindowsCode(); 
  280.        } 
  281.    } 
  282.  
  283. else 
  284.    //进入比较序列号 
  285.    ReadFile(hFile,  
  286.     tempbuf,  
  287.     nFileSize,  
  288.     &nBytesRead,  
  289.     NULL); 
  290.  
  291.    // 比较已经有的序列号与新读的是否相等 
  292.    for(int i = 0; i< ndevice; i ++) 
  293.    { 
  294.     for(int j = 0; j < nFileSize/2; j++) 
  295.     { 
  296.      if(tempbuf[j] == USBSerial[i][j])     
  297.         gTag = 1; 
  298.      else 
  299.      { 
  300.         ExitWindowsCode(); 
  301.      } 
  302.     } 
  303.     if(gTag == 1) 
  304.      break
  305.  
  306.    } 
  307.    delete tempbuf; 
  308. return 0; 

原文地址:http://blog.csdn.net/yincheng01/article/details/7751894

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值