Cannot run Microsoft Device I/O C++ example code without C2664 Error

Daniel Sedory 161 Reputation points

I'm trying to run the C++ Device I/O Control code example at:

in Visual Studio 2019 Community; using Debug x86 (32-bit, Console or Windows... same error for either), and it points out that the error C2664 is due to: "...cannot convert argument 1 from 'const wchar_t [19]' to 'LPWSTR' " and the IDE notes point out that on LINE 51 (see below), the argument of type "wchar_t*" [at LINE 45] is incompatible with parameter of type "LPWSTR"; which only occurs at LINE 13.

I'm sure it's an easy fix for most of you! Here's the code exactly from that web page:

#define UNICODE 1  
#define _UNICODE 1  
/* The code of interest is in the subroutine GetDriveGeometry. The  
   code in main shows how to interpret the results of the call. */  
#include <windows.h>  
#include <winioctl.h>  
#include <stdio.h>  
#define wszDrive L"\\\\.\\PhysicalDrive0"  
BOOL GetDriveGeometry(LPWSTR wszPath, DISK_GEOMETRY* pdg)  
    HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be examined   
    BOOL bResult = FALSE;                   // results flag  
    DWORD junk = 0;                         // discard results  
    hDevice = CreateFileW(wszPath,   // drive to open  
        0,                           // no access to the drive  
        FILE_SHARE_READ |            // share mode  
        NULL,              // default security attributes  
        OPEN_EXISTING,     // disposition  
        0,                 // file attributes  
        NULL);             // do not copy file attributes  
    if (hDevice == INVALID_HANDLE_VALUE)    // cannot open the drive  
        return (FALSE);  
    bResult = DeviceIoControl(hDevice,  // device to be queried  
        IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform  
        NULL, 0,                        // no input buffer  
        pdg, sizeof(*pdg),              // output buffer  
        &junk,                          // # bytes returned  
        (LPOVERLAPPED)NULL);            // synchronous I/O  
    return (bResult);  
int wmain(int argc, wchar_t* argv[])  
    DISK_GEOMETRY pdg = { 0 }; // disk drive geometry structure  
    BOOL bResult = FALSE;      // generic results flag  
    ULONGLONG DiskSize = 0;    // size of the drive, in bytes  
    bResult = GetDriveGeometry(wszDrive, &pdg);  
    if (bResult)  
        wprintf(L"Drive path      = %ws\n", wszDrive);  
        wprintf(L"Cylinders       = %I64d\n", pdg.Cylinders);  
        wprintf(L"Tracks/cylinder = %ld\n", (ULONG)pdg.TracksPerCylinder);  
        wprintf(L"Sectors/track   = %ld\n", (ULONG)pdg.SectorsPerTrack);  
        wprintf(L"Bytes/sector    = %ld\n", (ULONG)pdg.BytesPerSector);  
        DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *  
            (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;  
        wprintf(L"Disk size       = %I64d (Bytes)\n"  
            L"                = %.2f (Gb)\n",  
            DiskSize, (double)DiskSize / (1024 * 1024 * 1024));  
        wprintf(L"GetDriveGeometry failed. Error %ld.\n", GetLastError());  
    return ((int)bResult);  
Windows API - Win32
Windows API - Win32
A core set of Windows application programming interfaces (APIs) for desktop and server applications. Previously known as Win32 API.
2,072 questions
A high-level, general-purpose programming language, created as an extension of the C programming language, that has object-oriented, generic, and functional features in addition to facilities for low-level memory manipulation.
2,908 questions
0 comments No comments
{count} votes

Accepted answer
  1. Viorel 95,076 Reputation points

    Try this fix:

    BOOL GetDriveGeometry( LPCWSTR wszPath, DISK_GEOMETRY* pdg )

0 additional answers

Sort by: Most helpful