Информация о системе
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.04.03 18:49
Оценка: 63 (7)
Небольшой классик. Публикую потому, что подустал отсылать его разным людям. Они как сговорились, в третий раз за неделю.

Все на Апи и многое из реестра таскается. Частота проца вычисляется простым способом, котрый я публиковал здесь на сайте. Если вы видели чтото на форуме, не спешите предъявлять авторские права. Год назад я по частям публиковал все это.А писал, уверяю, сам
Этот класс был нужен именно для того, что он делает. Это он выполняет на 99.9%.
Многим он покажется не нужным — спорить не буду, решайте сами.

OS Version
Windows Directory
System Directory
Work Directory
Browser version

Sytem CPU info
Number of processor

Total physical memory
Avail physical memory
Total virtual memory
Avail virtual memory

Video resolution info

System bios version
System Bios date

Local drives info :
A:\ REMOVABLE
C:\ total 2047Mb free 1193Mb FAT FIXED
D:\ total 6644Mb free 3561Mb NTFS FIXED
E:\ CDROM
S:\ total 499Mb free 199Mb FAT FIXED
U:\ total 6644Mb free 3561Mb NTFS FIXED
V:\ total 6644Mb free 3561Mb NTFS FIXED
Y:\ total 2578Mb free 150Mb NTFS FIXED
****


// InfoCollector.h: interface for the CInfoCollector class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_INFOCOLLECTOR_H__231979C2_1C8B_11D6_A208_00C0F6B1F4AB__INCLUDED_)
#define AFX_INFOCOLLECTOR_H__231979C2_1C8B_11D6_A208_00C0F6B1F4AB__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


// from Platform SDK
#define VER_SERVER_NT                       0x80000000
#define VER_WORKSTATION_NT                  0x40000000
#define VER_SUITE_SMALLBUSINESS             0x00000001
#define VER_SUITE_ENTERPRISE                0x00000002
#define VER_SUITE_BACKOFFICE                0x00000004
#define VER_SUITE_COMMUNICATIONS            0x00000008
#define VER_SUITE_TERMINAL                  0x00000010
#define VER_SUITE_SMALLBUSINESS_RESTRICTED  0x00000020
#define VER_SUITE_EMBEDDEDNT                0x00000040
#define VER_SUITE_DATACENTER                0x00000080
#define VER_SUITE_SINGLEUSERTS              0x00000100
#define VER_SUITE_PERSONAL                  0x00000200
#define VER_SUITE_BLADE                     0x00000400

// from Platform SDK
#define VER_NT_WORKSTATION              0x0000001
#define VER_NT_DOMAIN_CONTROLLER        0x0000002
#define VER_NT_SERVER                   0x0000003


class CInfoCollector  
{
public:
    CInfoCollector();
    virtual ~CInfoCollector();

    virtual CString GetOverallInfo();

public:
    // from Platform SDK
    typedef struct _OSVERSIONINFOEX2 {
        DWORD dwOSVersionInfoSize;
        DWORD dwMajorVersion;
        DWORD dwMinorVersion;
        DWORD dwBuildNumber;
        DWORD dwPlatformId;
        TCHAR szCSDVersion[ 128 ];
        WORD wServicePackMajor;
        WORD wServicePackMinor;
        WORD wSuiteMask;
        BYTE wProductType;
        BYTE wReserved;
    } OSVERSIONINFOEX2;
    
protected:
    virtual DWORD CalcCPUSpeed();
    virtual BOOL GetBrowserInfo(CString& szBrowserInfo);
    virtual BOOL GetDirectoriesInfo(CString& szDirsInfo);
    virtual BOOL GetBiosInfo(CString& szBiosInfo);
    virtual BOOL GetVideoResolution(CString& szVideoInfo);
    virtual BOOL GetOSVersion(CString& szVersion);
    virtual BOOL GetMemoryInfo(CString& szMemInfo);
    virtual BOOL GetAllDisksInfo(CString& szDiskInfo);
    virtual BOOL GetCpuInfo(CString& szCpuInfo);

    BOOL CheckWin32Win(CString& szVersion,OSVERSIONINFOEX2& osvi);
    BOOL CheckWin32NT(CString &szVersion,OSVERSIONINFOEX2& osvi,BOOL bEx);
    DWORD CalculateSpeed();
    DWORD TimeStamp();
    BOOL CheckDirectoryAccess(LPCTSTR szPath);
    void GetDiskFree(LPCTSTR pszDrive,DWORD& dwTotal,DWORD& dwFree);
    
    static TCHAR* STR_UNKNOWN;
    static TCHAR* STR_NEWLINE;

    enum {
        WIN32s =     0x1,  
        WIN95 =        0x2,  
        WIN95OSR =    0x4,  
        WIN95OSR2 = 0x8,  
        WIN98 =        0x10, 
        WIN98SE =    0x20, 
        WINME =        0x40, 
        WINNT351 =    0x80, 
        WINNT40 =    0x100,
        WINNT50 =    0x200,
        WINTXP =        0x400,
        WHISTLER =    0x800
    };
    DWORD m_dwOsType;

};

typedef BOOL (WINAPI* PFNGETDISKFREESPACEEX)(LPCTSTR, PULARGE_INTEGER,PULARGE_INTEGER, PULARGE_INTEGER);


inline double find_disk_free(char *path)
{
    double val = 0.0;
    DWORD SectorsPerCluster;        // address of sectors per cluster 
    DWORD BytesPerSector;            // address of bytes per sector 
    DWORD NumberOfFreeClusters;    // address of number of free clusters  
    DWORD TotalNumberOfClusters;     // address of total number of clusters  
    
    LPSTR    pPathPointer = path;
    char    TmpPath[_MAX_PATH];
    int    len = lstrlen(path);
    
    if (len > 3) {
        lstrcpy(TmpPath, path);
        pPathPointer = TmpPath;
        if((TmpPath[0] == '\\' && TmpPath[1] == '\\') ||
            (TmpPath[0] == '/' && TmpPath[1] == '/')) {
            //            Check Network Drive
            pPathPointer = TmpPath+2;
            pPathPointer += strcspn(pPathPointer, "\\/");
            if(*pPathPointer != 0) {
                pPathPointer ++;
                pPathPointer += strcspn(pPathPointer, "\\/");
                if(*pPathPointer != 0) {
                    *(pPathPointer+1) = 0;
                }
            }
            pPathPointer = TmpPath;
        }
        else {
            *(pPathPointer+3) = 0;
        }
    }
    if (len < 3)
        val = (double)1000000.;
    else if (GetDiskFreeSpace(pPathPointer,
        &SectorsPerCluster,
        &BytesPerSector,
        &NumberOfFreeClusters,
        &TotalNumberOfClusters))
        val = (double)NumberOfFreeClusters *
        (double)SectorsPerCluster *
        (double)BytesPerSector;
    
    return val;
}

#endif // !defined(AFX_INFOCOLLECTOR_H__231979C2_1C8B_11D6_A208_00C0F6B1F4AB__INCLUDED_)




// InfoCollector.cpp: implementation of the CInfoCollector class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "InfoHarvest.h"
#include "InfoCollector.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHAR* CInfoCollector::STR_UNKNOWN = _T("Unknown");
CHAR* CInfoCollector::STR_NEWLINE = _T("\r\n");


CInfoCollector::CInfoCollector()
{
}

CInfoCollector::~CInfoCollector()
{
    
}

BOOL CInfoCollector::GetOSVersion(CString& szVersion)
{
    OSVERSIONINFOEX2 osvi;
    BOOL bEx = FALSE;

   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    
   if( !(bEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
   {
      // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
      if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
         return FALSE;
   }

    
   switch (osvi.dwPlatformId)
   {
    case VER_PLATFORM_WIN32_NT:
        return CheckWin32NT(szVersion,osvi,bEx);        
        
    case VER_PLATFORM_WIN32_WINDOWS:
        return CheckWin32Win(szVersion,osvi);
            
    case VER_PLATFORM_WIN32s:
        szVersion.Format(_T("Microsoft Win 3.1 or Win 3.11"));
        break;
   }
   return TRUE;
}

BOOL CInfoCollector::CheckWin32NT(CString &szVersion,CInfoCollector::OSVERSIONINFOEX2& osvi,BOOL bEx)
{
    CString szTemp = "";
    HKEY hKey;
    TCHAR szProductType[80];
    DWORD dwBufLen;
    BOOL b40 = FALSE;

    
    // Test for the product.
    
    if ( osvi.dwMajorVersion <= 4 )
    {
        szVersion = _T("Microsoft Windows NT ");
        b40 = TRUE;
    }
    
    if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
        szVersion = _T("Microsoft Windows 2000 ");
    
    
    if( bEx )  // Use information from GetVersionEx.
    { 
        // Test for the workstation type.
        if ( osvi.wProductType == VER_NT_WORKSTATION )
        {
            if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
                szVersion = _T("Microsoft Windows XP ");
            
            if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
                szVersion += _T("Home Edition " );
            else
                if( !b40 )
                    szVersion += _T("Professional " );
                else
                    szVersion += _T("Workstation " );
        }
        
        // Test for the server type.
        else if ( osvi.wProductType == VER_NT_SERVER )
        {
            if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
                szVersion = _T("Microsoft Windows .NET ");
            
            if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                szVersion += _T("DataCenter Server " );
            else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                if( osvi.dwMajorVersion == 4 )
                    szVersion += _T("Advanced Server " );
                else
                    szVersion += _T("Enterprise Server " );
                else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
                    szVersion += _T("Web Server " );
                else
                    szVersion += _T("Server " );
        }
    }
    else   // Use the registry on early versions of Windows NT.
    {
        RegOpenKeyEx( HKEY_LOCAL_MACHINE,
            "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
            0, KEY_QUERY_VALUE, &hKey );
        RegQueryValueEx( hKey, "ProductType", NULL, NULL,
            (LPBYTE) szProductType, &dwBufLen);
        RegCloseKey( hKey );
        if ( lstrcmpi( "WINNT", szProductType) == 0 )
            szVersion += _T("Professional " );
        if ( lstrcmpi( "LANMANNT", szProductType) == 0 )
            szVersion += _T("Server " );
        if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
            szVersion += _T("Advanced Server " );
    }
    
    // Display version, service pack (if any), and build number.
    
    if ( osvi.dwMajorVersion <= 4 )
    {
        szTemp.Format("%d.%d %s (Build %d)",
            osvi.dwMajorVersion,
            osvi.dwMinorVersion,
            osvi.szCSDVersion,
            osvi.dwBuildNumber & 0xFFFF);
    }
    else
    { 
        szTemp.Format("%s (Build %d)",
            osvi.szCSDVersion,
            osvi.dwBuildNumber & 0xFFFF);
    }
    szVersion += szTemp;
    return TRUE;
}

BOOL CInfoCollector::CheckWin32Win(CString &szVersion,CInfoCollector::OSVERSIONINFOEX2& osvi)
{
    if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
    {
        szVersion = _T("Microsoft Windows 95 ");
        if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )
            szVersion += _T("OSR2 " );
        return TRUE;
    } 
    
    if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
    {
        szVersion = _T("Microsoft Windows 98 ");
        if ( osvi.szCSDVersion[1] == 'A' )
            szVersion += _T("SE " );
        return TRUE;
    } 
    
    if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
    {
        szVersion = _T("Microsoft Windows Millennium Edition ");
        return TRUE;
    } 

    return FALSE;
}

BOOL CInfoCollector::GetCpuInfo(CString& szCpuInfo)
{
    LONG lRes;
    HKEY hKey;
    DWORD dwData;
    TCHAR chData[1024];
    DWORD dwDataSize = sizeof(dwData);
    SYSTEM_INFO s_info;
    CString szTemp;

    lRes = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
        _T("Hardware\\Description\\System\\CentralProcessor\\0"),
        0, KEY_QUERY_VALUE, &hKey);

    if(lRes != ERROR_SUCCESS)
        return FALSE;
    
    lRes = ::RegQueryValueEx (hKey, _T("~MHz"), NULL, NULL,
            (LPBYTE)&dwData, &dwDataSize);
    
    if(lRes)
        dwData = CalcCPUSpeed();


    dwDataSize = sizeof(chData);
    lRes = ::RegQueryValueEx (hKey, _T("Identifier"), NULL, NULL,
        (LPBYTE)chData, &dwDataSize);

    if( lRes )
        szCpuInfo.Format (_T("%d MHz "), dwData);
    else
        szCpuInfo.Format(_T("%s %d MHz "), chData,dwData);
        
    lRes += ::RegQueryValueEx (hKey, _T("VendorIdentifier"), NULL, NULL,
            (LPBYTE)chData, &dwDataSize);
    szCpuInfo += chData;
        
    
    lRes += RegCloseKey (hKey);

    GetSystemInfo(&s_info);
    szTemp.Format(_T("\r\nNumber of processor = %u"),s_info.dwNumberOfProcessors);
    szCpuInfo += szTemp;

    
    return TRUE;
}

BOOL CInfoCollector::GetMemoryInfo(CString& szCpuInfo)
{
    MEMORYSTATUS memstat;
    CString szTemp;

    GlobalMemoryStatus(&memstat);

    szCpuInfo.Format(_T("Total physical memory : %u Kb\r\n"),memstat.dwTotalPhys/1024);
    szTemp.Format(_T("Avail physical memory : %u Kb\r\n"),memstat.dwAvailPhys/1024);
    szCpuInfo += szTemp;

    szTemp.Format(_T("Total virtual memory : %u Kb\r\n"),memstat.dwTotalPageFile /1024);
    szCpuInfo += szTemp;

    szTemp.Format(_T("Avail virtual memory : %u Kb"),memstat.dwAvailPageFile/1024);
    szCpuInfo += szTemp;
    return TRUE;
}

BOOL CInfoCollector::GetVideoResolution(CString& szVideoInfo)
{
    HDC hdc = GetDC(NULL);

    szVideoInfo.Format(_T("%ux%u %u bits per pixel"),
                                GetSystemMetrics(SM_CXSCREEN),
                                GetSystemMetrics(SM_CYSCREEN),
                                GetDeviceCaps(hdc,BITSPIXEL));
    ReleaseDC(NULL,hdc);
    
    return TRUE;
}



BOOL CInfoCollector::GetBiosInfo(CString &szBiosInfo)
{
    HKEY hKey;
    LONG lRes;
    TCHAR data[1024];
    DWORD dwDataSize = sizeof(data);
    CString szTemp;

    lRes = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
        _T("Hardware\\Description\\System"),
        0, KEY_QUERY_VALUE, &hKey);

    if(lRes != ERROR_SUCCESS)
        return FALSE;
    
    lRes += ::RegQueryValueEx (hKey, _T("SystemBiosVersion"), NULL, NULL,
            (LPBYTE)data, &dwDataSize);
        
    szBiosInfo.Format ("%s \r\n", data);
        
    dwDataSize = sizeof(data);
    lRes += ::RegQueryValueEx (hKey, _T("SystemBiosDate"), NULL, NULL,
            (LPBYTE)data, &dwDataSize);

    szTemp.Format(_T("System Bios date : %s"),data);
    szBiosInfo += szTemp;
        
    
    lRes += RegCloseKey (hKey);

    
    return !lRes;
}


BOOL CInfoCollector::GetAllDisksInfo(CString& szDiskInfo)
{
    TCHAR data[1024];    
    TCHAR* ptr = data; 
    DWORD dwTotal,dwFree;
    CString szTemp;
    UINT type;

    TCHAR szFileSystemNameBuffer[256];
    DWORD dwVolumeSerialNumber;
    DWORD dwFileSystemNameSize=256;

    BOOL bResult;


    szDiskInfo = _T("Local drives info :\r\n");
    GetLogicalDriveStrings(1024,data);

    while(*ptr != TCHAR('\0') )
    {
        type = GetDriveType(ptr);
        if(type != DRIVE_REMOVABLE && type != DRIVE_CDROM)
        {
            GetDiskFree(ptr,dwTotal,dwFree);
            szTemp.Format(_T(" %s total %uMb free %uMb "),ptr,dwTotal,dwFree);

            bResult = GetVolumeInformation(ptr,
                NULL,
                0,
                &dwVolumeSerialNumber,
                NULL,
                NULL,
                szFileSystemNameBuffer,
                dwFileSystemNameSize);
            
            if( bResult )
                szTemp += szFileSystemNameBuffer;
        }
        else
            szTemp.Format(_T(" %s "),ptr);

        szDiskInfo += szTemp;

        switch( type )
        {
        case DRIVE_REMOVABLE:
            szDiskInfo += _T(" REMOVABLE\r\n");
            break;
        case DRIVE_FIXED:
            szDiskInfo += _T(" FIXED\r\n");
            break;
        case DRIVE_REMOTE:     
            szDiskInfo += _T(" NETWORK\r\n");
            break;
        case DRIVE_CDROM:
            szDiskInfo += _T(" CDROM\r\n");
            break;
        case DRIVE_RAMDISK :
            szDiskInfo += _T(" RAMDISK\r\n");
            break;
        default:
            szDiskInfo += _T(" UNKNOWN TYPE\r\n");
        }

        while(*ptr != TCHAR('\0')) 
            ptr++; 
        ptr++;
    }

    
    return  TRUE;
}


CString CInfoCollector::GetOverallInfo()
{
    CString szTemp;
    CString szInfo;
    CWaitCursor cursor;

    szInfo = _T("OS Version = ");
    if(GetOSVersion(szTemp))
        szInfo += szTemp;
    else
        szInfo += STR_UNKNOWN;

    szInfo+=STR_NEWLINE;
    GetDirectoriesInfo(szTemp);
    szInfo+=szTemp;

    szInfo+=_T("\r\nBrowser version = ");
    if(GetBrowserInfo(szTemp))
        szInfo += szTemp;
    else
        szInfo += STR_UNKNOWN;
    

    szInfo+=_T("\r\n\r\nSytem CPU info = ");
    if(GetCpuInfo(szTemp))
        szInfo += szTemp;
    else
        szInfo += STR_UNKNOWN;
    
    GetMemoryInfo(szTemp);
    szInfo += STR_NEWLINE;
    szInfo += STR_NEWLINE;
    szInfo += szTemp;
    
    szInfo += _T("\r\n\r\nVideo resolution info = ");
    if(GetVideoResolution(szTemp))
        szInfo += szTemp;
    else
        szInfo += STR_UNKNOWN;
    
    szInfo += _T("\r\n\r\nSystem bios version = ");
    if(GetBiosInfo(szTemp))
        szInfo += szTemp;
    else
        szInfo += STR_UNKNOWN;

    GetAllDisksInfo(szTemp);
    szInfo += STR_NEWLINE;
    szInfo += STR_NEWLINE;
    szInfo += szTemp;

    return szInfo;
}


BOOL CInfoCollector::GetDirectoriesInfo(CString& szDirsInfo)
{
    TCHAR data[MAX_PATH+1];
    TCHAR* ptr = data;

    szDirsInfo = _T("Windows Directory = ");
    GetWindowsDirectory(data,MAX_PATH+1);

    find_disk_free(data);
    szDirsInfo += data;
    if( !CheckDirectoryAccess(data) )
        szDirsInfo += _T("Write access denied !");

    szDirsInfo += _T("\r\nSystem Directory = ");
    GetSystemDirectory(data,MAX_PATH+1);
    find_disk_free(data);
    szDirsInfo += data;
    if( !CheckDirectoryAccess(data) )
        szDirsInfo+=_T("Write access denied !");
        
    szDirsInfo += _T("\r\nWork Directory = ");
    GetModuleFileName(GetModuleHandle(NULL),data,MAX_PATH+1);
    while(*ptr) ptr++;
    while(*ptr != TCHAR('\\')) ptr--;
    *ptr = TCHAR('\0');

    find_disk_free(data);

    szDirsInfo += data;
    if( !CheckDirectoryAccess(data) )
        szDirsInfo+=_T("Write access denied !");
    
    return TRUE;
}

BOOL CInfoCollector::GetBrowserInfo(CString &szBrowserInfo)
{
    LONG lRes;
    HKEY hKey;
    TCHAR chData[64];
    DWORD dwDataSize = sizeof(chData);
    
    lRes = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
        _T("Software\\Microsoft\\Internet Explorer"),
        0, KEY_QUERY_VALUE, &hKey);
    
    if(lRes != ERROR_SUCCESS)
        return FALSE;
    
    lRes += ::RegQueryValueEx (hKey, _T("Version"), NULL, NULL,
        (LPBYTE)chData, &dwDataSize);
    
    szBrowserInfo = chData;
    

    lRes += RegCloseKey (hKey);
    
    return lRes == 0;
}

DWORD CInfoCollector::CalcCPUSpeed()
{
   DWORD dwSpeed = 0;
    
    DWORD dwStartingPriority = GetPriorityClass(GetCurrentProcess());
    SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
    
    dwSpeed = CalculateSpeed();
    
    SetPriorityClass(GetCurrentProcess(), dwStartingPriority);
    
    return dwSpeed;
}


DWORD CInfoCollector::CalculateSpeed()
{
   int    nTimeStart = 0;
   int    nTimeStop = 0;
   DWORD dwStartTicks = 0;
   DWORD dwEndTicks = 0;
   DWORD dwTotalTicks = 0;
   DWORD dwCpuSpeed = 0;
    
    
   nTimeStart = GetTickCount();
    
    dwStartTicks = TimeStamp();
    
   for(;;)
   {
      nTimeStop = GetTickCount();
      if ((nTimeStop - nTimeStart) > 2000)    // one-half second
      {
         dwEndTicks = TimeStamp();
         break;
      }
   }
    
   dwCpuSpeed = (dwEndTicks - dwStartTicks) / (20*100000); // MHz
    
   return (dwCpuSpeed);
}

DWORD CInfoCollector::TimeStamp()
{
   DWORD dwTickVal;
    
   __asm
   {
      _emit 0Fh   // RDTSC
        _emit 31h
        mov   dwTickVal, eax
   }
    
   return dwTickVal;    
}

void CInfoCollector::GetDiskFree(LPCTSTR pszDrive, DWORD &dwTotal, DWORD &dwFree)
{
    PFNGETDISKFREESPACEEX pGetDiskFreeSpaceEx = NULL;
    __int64 i64FreeBytesToCaller;
    __int64 i64TotalBytes;
    __int64 i64FreeBytes;
    DWORD    dwSectPerClust; 
    DWORD    dwBytesPerSect;
    DWORD    dwFreeClusters; 
    DWORD    dwTotalClusters;
    

#ifdef _UNICODE
    pGetDiskFreeSpaceEx = (PFNGETDISKFREESPACEEX)GetProcAddress( GetModuleHandle("kernel32.dll"),
        "GetDiskFreeSpaceExW");
#else
    pGetDiskFreeSpaceEx = (PFNGETDISKFREESPACEEX)GetProcAddress( GetModuleHandle("kernel32.dll"),
        "GetDiskFreeSpaceExA");
#endif
    
    if (pGetDiskFreeSpaceEx)
    {
        pGetDiskFreeSpaceEx (pszDrive,
            (PULARGE_INTEGER)&i64FreeBytesToCaller,
            (PULARGE_INTEGER)&i64TotalBytes,
            (PULARGE_INTEGER)&i64FreeBytes);

        dwTotal = DWORD(i64TotalBytes / (1024*1024));
        dwFree =  DWORD(i64FreeBytesToCaller / (1024*1024));
    }
    else 
    {
        GetDiskFreeSpace (pszDrive, 
            &dwSectPerClust, 
            &dwBytesPerSect,
            &dwFreeClusters, 
            &dwTotalClusters);

        dwTotal = DWORD((__int64(dwTotalClusters) * dwSectPerClust * dwBytesPerSect)/(1024*1024));
        dwFree = DWORD((__int64(dwFreeClusters) * dwSectPerClust * dwBytesPerSect)/(1024*1024));
        
    }
}

BOOL CInfoCollector::CheckDirectoryAccess(LPCTSTR szPath)
{
    TCHAR* szPre = "mad";  
    TCHAR szFileName[MAX_PATH+1];
    HANDLE hFile = NULL;
    int iResult = 0;

    GetTempFileName(szPath,szPre,0,szFileName);

    hFile = CreateFile(szFileName,
        GENERIC_WRITE |GENERIC_READ,
        0,NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    if(hFile == INVALID_HANDLE_VALUE)
        return FALSE;

    iResult += (int)!CloseHandle(hFile);
    iResult += (int)!DeleteFile(szFileName);    

    return  !iResult;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.