⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udiskclassify.cpp

📁 Get Product Model and Product Vendor of UDisk. Dll & test program.
💻 CPP
字号:
/**
* File
*	UDiskClassify.cpp
* Brief
*	Implementation of CUDiskClassify.
* Author
*	Zo Yong Min
*************************************************************/


// UDiskClassify.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <tchar.h>
#include <stdio.h>
#include "UDiskClassify.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif



CUDiskClassify::CUDiskClassify()
{
}

BOOL CUDiskClassify::GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
	STORAGE_PROPERTY_QUERY	Query;	
	DWORD dwOutBytes;				
	BOOL bResult;					

	Query.PropertyId = StorageDeviceProperty;
	Query.QueryType = PropertyStandardQuery;

	bResult = ::DeviceIoControl(hDevice,			
		IOCTL_STORAGE_QUERY_PROPERTY,			
		&Query, sizeof(STORAGE_PROPERTY_QUERY),	
		pDevDesc, pDevDesc->Size,				
		&dwOutBytes,							
		(LPOVERLAPPED)NULL);					

	return bResult;
}

char CUDiskClassify::chFirstDriveFromMask(ULONG unitmask)
{
	char i;
	for (i=0; i<MAX_UD; ++i)  
	{
		if (unitmask & 0x1) 
			break;
		unitmask = unitmask >> 1;
	}
	return 'A' + i;
}

int CUDiskClassify::GetUDiskCount()
{
	return m_udnum;
}

UDISK_INFO *CUDiskClassify::GetUDiskInfo()
{
	return &m_udi[0];
}

void CUDiskClassify::ScanUDisk()
{
	int				k = 1;
	DWORD			MaxDriveSet = 0, CurDriveSet = 0;
	TCHAR			szBuf[300];
	HANDLE			hDevice;
	TCHAR			szDrvName[33];
	PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;
	char *p;

	// initialize
	m_udnum = 0;
	ZeroMemory(m_udi, sizeof(UDISK_INFO) * MAX_UD);

	// rescan
	MaxDriveSet = GetLogicalDrives();
	CurDriveSet = MaxDriveSet;
	for (DWORD drive = 0; drive < MAX_UD; ++drive)
	{
		if ( MaxDriveSet & (1 << drive) )  
		{
			DWORD temp = 1<<drive;
			ZeroMemory(szDrvName, sizeof(szDrvName));
			_stprintf_s(szDrvName, _T("%c:\\"), 'A'+drive );
			if(GetDriveType(szDrvName)== DRIVE_REMOVABLE)
			{
				_stprintf_s(szBuf, _T("\\\\?\\%c:"), 'A'+drive);
				hDevice = CreateFile(szBuf, GENERIC_READ,
					FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
					OPEN_EXISTING, NULL, NULL);

				if (hDevice != INVALID_HANDLE_VALUE)
				{

					pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1];
					pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1;

					if(GetDisksProperty(hDevice, pDevDesc))
					{
						// set info 1
						m_udi[m_udnum].MoveDiskName = chFirstDriveFromMask(temp);
						p = (char*)pDevDesc;

						// set info 2
						strcpy_s(m_udi[m_udnum].VendorId, (pDevDesc->VendorIdOffset ? &p[pDevDesc->VendorIdOffset]:"(NULL)"));
						// set info 3
						strcpy_s(m_udi[m_udnum].ProductId, (pDevDesc->ProductIdOffset ? &p[pDevDesc->ProductIdOffset]:"(NULL)"));
						// set info 4
						strcpy_s(m_udi[m_udnum].ProductRevision, (pDevDesc->ProductRevisionOffset ? &p[pDevDesc->ProductRevisionOffset]:"(NULL)"));
						// set info 5
						strcpy_s(m_udi[m_udnum].SerialNumber, (pDevDesc->SerialNumberOffset ? &p[pDevDesc->SerialNumberOffset]:"(NULL)"));

						// count
						m_udnum++;
					}

					delete pDevDesc;
					CloseHandle(hDevice);
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -