Click here to Skip to main content
15,900,461 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
the following is the code I used, but alway failed with error 0x8004101e(wbemErrIllegalOperation reference here WbemErrorEnum (Windows)[^]) when call
C++
hr = pclsObj->GetMethod(bstrMethod, 0, &pInParamsDefinition, &pOutParamsDefinition);


,I really don't know why, any suggestions is appreciated. thanks in advance.

C++
	HRESULT WMI_FormatVolume(BYTE volumeLetter, eFileSystem fs, const WCHAR* szLabel, bool bQuickFormat, UINT clusterSize, bool bEnableCompression)
	{
		HRESULT hr = S_OK;

		hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ); 
		if( FAILED(hr) )
			return hr;

		IWbemLocator *pLocator = NULL;
		IWbemServices *pSvc = NULL;
		do 
		{
			hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
			if( !SUCCEEDED(hr) )
				break;

			hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pLocator)); 
			if( !SUCCEEDED(hr) )
				break;

			hr = pLocator->ConnectServer(_bstr_t( L"ROOT\\CIMV2" ), NULL, NULL, NULL, 0, NULL, NULL, &pSvc);    
			if( !SUCCEEDED(hr) )
				break;

			hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
			if( !SUCCEEDED(hr) )
				break;

			_bstr_t bstrMethod(L"Format");
			_bstr_t bstrClassName(L"Win32_Volume");

// 			IWbemClassObject* pClass = NULL;
// 			hr = pSvc->GetObject(bstrClassName, 0, NULL, &pClass, NULL);
// 			if( !SUCCEEDED(hr) )
// 				break;
// 			
// 			IWbemClassObject* pInParamsDefinition = NULL;
// 			hr = pClass->GetMethod(bstrMethod, 0, &pInParamsDefinition, NULL);
// 			if( !SUCCEEDED(hr) )
// 				break;
// 
// 			IWbemClassObject* pClassInstance = NULL;
// 			hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
// 			if( !SUCCEEDED(hr) )
// 				break;

			// execute QWL to query volume info
			IEnumWbemClassObject* pEnumerator = NULL;
			WCHAR szWQL[128] = L""; swprintf_s(szWQL, L"SELECT * FROM Win32_Volume WHERE DriveLetter = '%c:'", volumeLetter);
			hr = pSvc->ExecQuery(_bstr_t(L"WQL"), _bstr_t(szWQL), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
			if( !SUCCEEDED(hr) )
				break;

			while ( pEnumerator )
			{
				ULONG uReturn = 0;
				IWbemClassObject *pclsObj = NULL;
				hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
				if( !SUCCEEDED(hr) )
					break;

				IWbemClassObject* pInParamsDefinition = NULL;
				IWbemClassObject* pOutParamsDefinition = NULL;
				hr = pclsObj->GetMethod(bstrMethod, 0, &pInParamsDefinition, &pOutParamsDefinition);
				if( !SUCCEEDED(hr) )
					break;

				IWbemClassObject* pClassInstance = NULL;
				hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
				if( !SUCCEEDED(hr) )
					break;

				_variant_t varFileSystem(GetFileSystemStr(fs));
				_variant_t varQuickFormat(bQuickFormat);
				_variant_t varClusterSize(clusterSize);
				_variant_t varLabel(szLabel);
				_variant_t varEnableCompression(bEnableCompression);
				hr = pClassInstance->Put(L"FileSystem", 0,	&varFileSystem, 0);
				hr = pClassInstance->Put(L"QuickFormat", 0, &varQuickFormat, 0);
				hr = pClassInstance->Put(L"ClusterSize", 0,	&varClusterSize, 0);
				hr = pClassInstance->Put(L"Label", 0, &varLabel, 0);
				hr = pClassInstance->Put(L"EnableCompression", 0, &varEnableCompression, 0);

				IWbemClassObject* pOutParams = NULL;
				hr = pSvc->ExecMethod(bstrClassName, bstrMethod, 0, NULL, pClassInstance, &pOutParams, NULL);
				if( !SUCCEEDED(hr) )
					break;
			}

		} while ( 0 );

		if ( NULL != pLocator )
			pLocator->Release();

		if ( NULL != pSvc )
			pSvc->Release();

		CoUninitialize();

		return hr;
	}
Posted
Comments
Mehdi Gholam 26-Dec-15 3:14am    
Try running as an administrator.
BCN-163 27-Dec-15 22:34pm    
3Q, but it's not the problem of previlege, after another google search, I sovled the problem.
I will post the solution later, hope it's helpful to others who encounter with the same problem like me.

1 solution

here is the right way to call Format use WMI. reference websites are as follow.
How to format a RAW disk in windows by C++ | wreckor[^]
blog.aaronballman.com/2011/07/calling-instance-methods-in-wmi/#comment-48687

C++
namespace Utility
{
	const WCHAR* GetFileSystemStr(eFileSystem fs)
	{
		switch ( fs )
		{
		case FS_FAT32:
			return L"FAT32";
		case FS_FAT:
			return L"FAT";
		case FS_NTFS:
		default:
			return L"NTFS";
		}
	}

	HRESULT WMI_FormatVolume(BYTE volumeLetter, const TCHAR* szLabel, int* pErrorCode, eFileSystem fs, bool bQuickFormat, LONG clusterSize, bool bEnableCompression)
	{
		HRESULT hr = S_OK;

		hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 
		if( S_OK != hr )
			return hr;

		IWbemLocator *pLocator = NULL;
		IWbemServices *pService = NULL;
		IWbemClassObject* pClass = NULL;
		IWbemClassObject* pInParamsDefinition = NULL;
		IWbemClassObject* pClassInstance = NULL;
		IEnumWbemClassObject* pEnumerator = NULL;
		
		do
		{
			hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
			if( S_OK != hr )
				break;

			hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<lpvoid*>(&pLocator)); 
			if( S_OK != hr )
				break;

			hr = pLocator->ConnectServer(_bstr_t( L"ROOT\\CIMV2" ), NULL, NULL, NULL, 0, NULL, NULL, &pService);    
			if( S_OK != hr )
				break;

			hr = CoSetProxyBlanket(pService, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
			if( S_OK != hr )
				break;

			_bstr_t bstrMethod(L"Format");
			_bstr_t bstrClassName(L"Win32_Volume");

                        // get class and method here
			hr = pService->GetObject(bstrClassName, 0, NULL, &pClass, NULL);
			if( S_OK != hr )
				break;
			
			hr = pClass->GetMethod(bstrMethod, 0, &pInParamsDefinition, NULL);
			if( S_OK != hr )
				break;

			hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
			if( S_OK != hr )
				break;

			// execute QWL to query volume info
			WCHAR szWQL[128] = L""; swprintf_s(szWQL, L"SELECT * FROM Win32_Volume WHERE DriveLetter = '%c:'", volumeLetter);
			hr = pService->ExecQuery(_bstr_t(L"WQL"), _bstr_t(szWQL), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
			if( S_OK != hr )
				break;

			while ( pEnumerator )
			{
				ULONG uReturn = 0;
				IWbemClassObject* pVolumeObj = NULL;
				hr = pEnumerator->Next(WBEM_INFINITE, 1, &pVolumeObj, &uReturn);
				if ( 0 == uReturn )
					break;

				// set format param
				_variant_t varFileSystem(GetFileSystemStr(fs));
				_variant_t varQuickFormat(bQuickFormat);
				_variant_t varClusterSize(clusterSize);
				_variant_t varLabel(szLabel);
				_variant_t varEnableCompression(bEnableCompression);
				hr = pClassInstance->Put(L"FileSystem", 0,	&varFileSystem, 0);
				hr = pClassInstance->Put(L"QuickFormat", 0, &varQuickFormat, 0);
				hr = pClassInstance->Put(L"ClusterSize", 0,	&varClusterSize, 0);
				hr = pClassInstance->Put(L"Label", 0, &varLabel, 0);
				hr = pClassInstance->Put(L"EnableCompression", 0, &varEnableCompression, 0);

				// key!!! get class object 
				_variant_t var;
				hr = pVolumeObj->Get(L"__PATH", 0, &var, NULL, NULL);
				pVolumeObj->Release();

				if( S_OK != hr )
					break;

				IWbemClassObject* pOutParams = NULL;
				hr = pService->ExecMethod(var.bstrVal, bstrMethod, 0, NULL, pClassInstance, &pOutParams, NULL);
				if( S_OK != hr )
					break;

				_variant_t varReturnValue;
				pOutParams->Get(L"ReturnValue", 0, &varReturnValue, NULL, 0);
				pOutParams->Release();

				int formatResult = varReturnValue.intVal;
				if ( 0 != formatResult )
					hr = S_FALSE;

				if ( NULL != pErrorCode )
					*pErrorCode = formatResult;
			}

		} while( 0 );

		if ( NULL != pLocator )
			pLocator->Release();

		if ( NULL != pService )
			pService->Release();

		if ( NULL != pClass )
			pClass->Release();

		if ( NULL != pInParamsDefinition )
			pInParamsDefinition->Release();

		if ( NULL != pClassInstance )
			pClassInstance->Release();

		if ( NULL != pEnumerator )
			pEnumerator->Release();

		CoUninitialize();

		return hr;
	}

}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900