VC++实现U盘开机锁
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
请见代码分析
#include <windows.h>#include <winioctl.h>#include <stdio.h>#include <initguid.h>#include <setupapi.h>#include <string.h>#define MAX_DEVICE 256wchar_t USBSerial[5][100] = {TEXT("")};int gTag = 0;DEFINE_GUID(UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);// SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大#define INTERFACE_DETAIL_SIZE (1024)// IOCTL控制码#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)#pragma comment(lib,"setupapi.lib")//自动关机函数void ExitWindowsCode(){ OSVERSIONINFO stOSVI; ZeroMemory(&stOSVI , sizeof ( OSVERSIONINFO )) ; stOSVI.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO ) ; if (!GetVersionEx ( &stOSVI )) return; if ( ( VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId ) && ( 4 <= stOSVI.dwMajorVersion ) ) { HANDLE hToken; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return; // Get the LUID for the shutdown privilege. LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS) return; if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE|EWX_POWEROFF, 0)) return; } else//WIN9X { ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_POWEROFF, 0);// 关机 } }// 根据GUID获得设备路径,用来判断U盘设备// lpGuid: GUID指针// pszDevicePath: 设备路径指针的指针// 返回: 成功得到的设备路径个数,可能不止1个int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath){ HDEVINFO hDevInfoSet; //设备信息集句柄; SP_DEVICE_INTERFACE_DATA ifdata; PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail; int nCount; BOOL bResult; // 取得一个该GUID相关的设备信息集句柄 hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&UsbClassGuid, // class GUID NULL, // 无关键字 NULL, // 不指定父窗口句柄 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备 // 失败... if (hDevInfoSet == INVALID_HANDLE_VALUE) { return 0; } // 申请设备接口数据空间 pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE); pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); nCount = 0; bResult = TRUE; // 设备序号=0,1,2... 逐一测试设备接口,到失败为止 while (bResult) { ifdata.cbSize = sizeof(ifdata); // 枚举符合该GUID的设备接口 bResult = ::SetupDiEnumDeviceInterfaces( hDevInfoSet, // 设备信息集句柄 NULL, // 不需额外的设备描述 lpGuid, // GUID (ULONG)nCount, // 设备信息集里的设备序号 &ifdata); // 设备接口信息 if (bResult) { // 取得该设备接口的细节(设备路径) bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet, // 设备信息集句柄 &ifdata, // 设备接口信息 pDetail, // 设备接口细节(设备路径) INTERFACE_DETAIL_SIZE, // 输出缓冲区大小 NULL, // 不需计算输出缓冲区大小(直接用设定值) NULL); // 不需额外的设备描述 if (bResult) { // 复制设备路径到输出缓冲区 wcscpy_s(pszDevicePath[nCount],wcslen(pDetail->DevicePath)+1, pDetail->DevicePath); // 调整计数值 nCount++; } } } // 释放设备接口数据空间 ::GlobalFree(pDetail); // 关闭设备信息集句柄 ::SetupDiDestroyDeviceInfoList(hDevInfoSet); return nCount;}// 返回U盘设备句柄 hDeviceHANDLE OpenDevice(wchar_t* DevicePath){ HANDLE hDevice; hDevice = CreateFileW(DevicePath, GENERIC_READ && GENERIC_WRITE, FILE_SHARE_READ && FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); return hDevice;}int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { int i, nDevice; // nDevice 表示有多少个USB设备 int ndevice = 0; // 表示多少个U盘设备(可进行读写的设备) wchar_t* szDevicePath[MAX_DEVICE]; // 设备路径 HANDLE hDevice; // DWORD dwOutBytes; // IOCTL输出数据长度 // 定义一个 PSTORAGE_DEVICE_DESCRIPTOR 变量,存放设备属性 PSTORAGE_DEVICE_DESCRIPTOR DeviceDesc; // 变量初始化 DeviceDesc=(PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1]; DeviceDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1; // 分配需要的空间 for (i = 0; i < MAX_DEVICE; i++) { szDevicePath[i] = new wchar_t[256]; } // 取设备路径 nDevice = ::GetDevicePath((LPGUID)&UsbClassGuid, szDevicePath); // 逐一获取设备信息 for (i = 0; i < nDevice; i++) { // 打开设备 hDevice = OpenDevice(szDevicePath[i]); if (hDevice != INVALID_HANDLE_VALUE) { for(int j = 0; j < 4; j++) { USBSerial[ndevice][j] = szDevicePath[i][j+12]; } for(int j = 4; j < 28; j++) { USBSerial[ndevice][j] = szDevicePath[i][j+22]; } //printf("U盘序列号为:"); //wprintf(L"%ws\n", USBSerial[ndevice]); ndevice ++; ::CloseHandle(hDevice); } } // 释放空间 for (i = 0; i < MAX_DEVICE; i++) { delete []szDevicePath[i]; }// 文件操作 HANDLE hFile; DWORD nBytesRead = 0, dwBytesWritten = 0; // 打开文件hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"), // file to open GENERIC_READ | GENERIC_WRITE, // open for reading FILE_SHARE_READ | FILE_SHARE_WRITE, // share for reading NULL, // default security OPEN_EXISTING , // existing file only FILE_ATTRIBUTE_NORMAL, // normal file NULL); // no attr. templateif (hFile != INVALID_HANDLE_VALUE){ long nFileSize = GetFileSize(hFile, NULL); if (nFileSize == 0) { bool flag2 = CloseHandle(hFile); if(::SetFileAttributes(TEXT("C:\\Windows\\system32\\USBID.ID"),FILE_ATTRIBUTE_NORMAL)) { if (DeleteFile(TEXT("C:\\Windows\\system32\\USBID.ID"))) { //MessageBox(NULL,TEXT("oo"),TEXT("oo"),MB_OK); } } }}// 打开文件hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"), // file to open GENERIC_READ | GENERIC_WRITE, // open for reading FILE_SHARE_READ | FILE_SHARE_WRITE, // share for reading NULL, // default security OPEN_EXISTING , // existing file only FILE_ATTRIBUTE_NORMAL, // normal file NULL); // no attr. templateif (hFile == INVALID_HANDLE_VALUE) { hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"), // file to create GENERIC_READ | GENERIC_WRITE, // open for writing FILE_SHARE_READ | FILE_SHARE_WRITE, // do not share NULL, // default security CREATE_ALWAYS, // overwrite existing FILE_ATTRIBUTE_NORMAL | // normal file FILE_ATTRIBUTE_NORMAL, // asynchronous I/O NULL); }else{ if (ndevice < 1) { ExitWindowsCode(); }}long nFileSize = GetFileSize(hFile, NULL);wchar_t *tempbuf = new wchar_t[nFileSize] ; // 读文件内容if (nFileSize == 0) { // 创建文件,并把序列号写入文件中 hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"), // file to create GENERIC_READ | GENERIC_WRITE, // open for writing FILE_SHARE_READ | FILE_SHARE_WRITE, // do not share NULL, // default security CREATE_ALWAYS, // overwrite existing FILE_ATTRIBUTE_NORMAL | // normal file FILE_ATTRIBUTE_NORMAL, // asynchronous I/O NULL); // no attr. template if (hFile == INVALID_HANDLE_VALUE) { return 0; } // 把序列号写入文件中 WriteFile(hFile, USBSerial, 2*wcslen(* USBSerial), &dwBytesWritten, NULL); nFileSize = GetFileSize(hFile, NULL); if (nFileSize == 0) { bool flag1 = CloseHandle(hFile); } else { if (ndevice < 1) { ExitWindowsCode(); } }}else{ //进入比较序列号 ReadFile(hFile, tempbuf, nFileSize, &nBytesRead, NULL); // 比较已经有的序列号与新读的是否相等 for(int i = 0; i< ndevice; i ++) { for(int j = 0; j < nFileSize/2; j++) { if(tempbuf[j] == USBSerial[i][j]) gTag = 1; else { ExitWindowsCode(); } } if(gTag == 1) break; } delete tempbuf;}return 0;}
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
![](/assets/blank.gif)
VC++实现U盘开机锁相关推荐
- 利用GINA实现U盘开机锁
一.原理 GINA是WinLogon的可插入部件.Windows操作系统中Winlogon进程负责管理与登录和身份认证相关的安全性工作,包括处理用户的登录与注销.启动用户shell.输入口令.更 ...
- 通过编写自定义的gina.dll实现U盘开机锁
simples.c 编译为可执行程序simples.exe 下面的程序编译为ginafuncs.dll并用它替换c:\windows\system32下的msgina.dll 开机时ginafuncs ...
- 如何通过Win10系统的密码重置盘来重置电脑开机锁屏密码?
我们在使用电脑时总会设置一下开机/锁屏密码来防止个人隐私泄露,这个密码其实就是用户帐户密码.如果我们哪天突然忘记了这个登录密码就麻烦了,所以我们要未雨绸缪. 所幸Win10系统就提供了这样的功能,可以 ...
- vivo S16/S15/S12/S10 PRO卡刷线刷系统升级降级推荐成功解决屏幕锁不记得开机锁成功刷好的有效方案
vivo S16/S15 PRO,vivo S12/S10 PRO怎么解锁呢.忘记密码了看了一些刷机解锁视频不拆机能解锁的方法修改密码清除锁定升级更新降版本固件系统资料原方包刷机教程太卡怎么降级到原来 ...
- android锁屏流程_Android开机锁屏流程分析
Android开机锁屏流程: 首先:手机开机时,在SystemServer类的init2()方法中会启动线程类ServerThread的run方法如下: WindowMan Android开机锁屏流程 ...
- Android系统永不熄屏和取消开机锁屏功能
Android系统取消开机锁屏功能和永不熄屏 源码 frameworks/base/packages/SettingsProvider/src/com/android/providers/settin ...
- 移动计算机怎么开机密码,制作u盘开机密码钥匙教程
如何制作u盘开机密码钥匙呢?现在我们使用u盘的次数很多,文件的安全性也是非常重要的,我们完全可以借助特定U盘.移动硬盘这类硬件认证登陆自己的计算机,怎么制作u盘电脑开机密码钥匙呢?快来看看下面的制作u ...
- ubuntu修改root及开机锁屏密码
当拷贝过来的ubuntu是其他人的时,一般情况密码特麻烦不容易记,修改自己熟悉密码: sudo passwd root #这是修改root密码 sudo passwd 用户名 #这是修改开机锁屏密码, ...
- 小米3Android密码怎么解吗,小米3忘了开机锁屏的解锁密码怎么办
今天给大家说一个部分机友容易出现的问题,那就是把小米3手机的开机解锁密码忘了怎么办,这个问题不但是小米手机的人会出现,其它手机的也会出现,因为手机一旦忘了开机锁屏的解锁密码之后,手机不能正常的进入系统 ...
最新文章
- 对付审稿人“强迫引用”,新方法来了,Nature都说好
- 只需3步,随时随地玩转数据分析
- LeetCode 744. Find Smallest Letter Greater Than Target (时间复杂度O(n))
- Rumor CodeForces - 893C
- 嗨,你选择自学成才还是参加培训?
- 555定时器回差电压计算公式_555时基电路引脚解析
- 计算机网络必备知识,非常全面!
- Android之jni解决JNIEnv跨线程问题
- python comprehension_python list comprehension在一次迭代中产生两个值
- db2 空值转换函数_Excel一键转换百分比
- 一览众山小的上一句是什么,怎么理解一览众山小的意思?
- 为何 5G、物联网和区块链,可以成为科技铁三角?
- C# list删除 另外list里面的元素_Java集合大全Map,Set,List
- win10 安装SQL Server 2005--以及---安装SQL2005之后卸载,重新安装时提示“安装默认报表服务器的必备组件检查失败”的方法
- png、jpg图片格式的区别及
- 程序员工资真的很高么,月入几万的难道不是吹牛?
- VBA 32位代码适配64位
- 【Leetcode】1564. Put Boxes Into the Warehouse I
- Android 8.0(Android O) AccountManager 行为变更
- c语言赋值符号,运算符赋值运算符 - C语言教程