个人技术分享

win代码

1.代码:
GetLogicalDriveStrings(1024,(LPWSTR)DStr);
解释
DWORD GetLogicalDriveStringsW(
		[in]  DWORD  nBufferLength,
		[out] LPWSTR lpBuffer
	);
[in] nBufferLength
    TCHAR 中由 lpBuffer 指向的缓冲区的最大大小。 此大小不包括终止 null 字符。 如果此参数为零,则不使用 lpBuffer,即缓冲区不可用
    3。
[out] lpBuffer
    指向一个缓冲区的指针,该缓冲区接收一系列以 null 结尾的字符串,一个用于系统中每个有效驱动器,另外还有一个 null 字符。 每个字符串都是设备名称。 
    例如:电脑上有C,D两个硬盘盘符,则它能得到一个字符串是:
		'C',':','/',' ','D',':','/',' ',' '
		即:C:/<null>D:/<null><null>
返回值:是获得的字符串长度,即硬盘盘符的个数乘以4,

即 将所有的卷存储在buffer中,格式为:C:/NULLD:/NULLE:/NULL

2.代码:
DType = GetDriveType((LPCWSTR)DStr+i*4);
解释:

对设备类型进行判断

返回值:

  • #define DRIVE_UNKNOWN 0 //The drive type cannot be determined. 未知

  • #define DRIVE_NO_ROOT_DIR 1 //The root path is invalid; for example, there is no volume is mounted at the path. 可移动磁盘

  • #define DRIVE_REMOVABLE 2 //The drive has removable media; for example, a floppy drive, thumb drive, or flash card reader. U盘,软盘

  • #define DRIVE_FIXED 3//The drive has fixed media; for example, a hard drive or flash drive. 本地硬盘,移动硬盘

  • #define DRIVE_REMOTE 4 //The drive is a remote (network) drive.网络磁盘

  • #define DRIVE_CDROM 5 //The drive is a CD-ROM drive. CD-ROM

  • #define DRIVE_RAMDISK 6 //The drive is a RAM disk. RAM磁盘

3.代码
fResult = GetDiskFreeSpaceEx (  //计算磁盘的各种容量
				(LPCWSTR)DStr+i*4,                      // [IN]指定哪个磁盘
				(PULARGE_INTEGER)&i64FreeBytesToCaller,	// [OUT]磁盘空闲容量
				(PULARGE_INTEGER)&i64TotalBytes,		// [OUT]磁盘总容量
				(PULARGE_INTEGER)&i64FreeBytes);		// [OUT]可用的磁盘空闲容量
返回值:fResult是bool类型,能够判断驱动器是否在工作状态
4.代码
GetVolumeInformation(
    lpRootPathName,			  // [IN]卷所在的根目录,如:"C:\\", 如果为NULL,表示当前目录
    (LPWSTR)szVolumeName,	  // [OUT]输出参数,存放卷名缓冲区
    255,					  // [IN]卷名缓冲区长度
    &VolumeSerialNumber,	  // [OUT]卷序列号
    lpMaximumComponentLength, // [OUT]最大文件文件名组件长度,随文件系而变化
    lpFileSystemFlags,		  // [OUT]文件系统的一些属性,通常为一些宏的组合
    (LPWSTR)szFileSystem,	  // [OUT]说明何种文件系统,例如NTFS,  FAT等
    255);					  // [IN]文件系统缓冲区长度
5.代码
//创建文件  执行成功后会返回文件句柄
hDevice = CreateFile(
    driver_disknumber,  // 指向文件名的指针  
    GENERIC_READ | GENERIC_WRITE,    // // 访问模式(写 / 读) 
    FILE_SHARE_READ | FILE_SHARE_WRITE,    //共享模式  若指明多个属性,可用“|”将几个属性做或运算
    NULL,             // 指向安全属性的指针 表示本文件句柄的安全属性,能影响其是否可被子进程继承等操作,
    //若设置为NULL 则子进程不能继承本句柄
    OPEN_EXISTING,    // 如何创建:指定是否创建文件、覆盖现有文件等,此处表示打开现有文件,若文件不存在则失败 
    0,                // 文件属性
    NULL);            // 用于复制文件句柄,一般情况下设置为NULL 
result = DeviceIoControl(  // 返回值是bool类型
    hDevice,                // 要操作的设备的句柄
    IOCTL_STORAGE_GET_DEVICE_NUMBER, // dwIoControlCode 控制设备的指令
    NULL,                            // lpInBuffer 设备操控请求数据的缓冲区基址,如果dwIoControlCode 指定了一个操作,该操作不需要输入数据,那么这个参数设为NULL
    0,                               // nInBufferSize lplnBuffer的size
    &number,           // output buffer 存放输出数据的buffer
    sizeof(number),         // size of output buffer
    &readed,       // number of bytes returned 实际输出数据的bytes
    NULL      // OVERLAPPED structure
);

CloseHandle(hDevice); //关闭打开的对象句柄