ok so i have some code that works perfectly with visual studio 2003, but when i move it into my project which is using visual studio 2008, the compiler spits out 9 errors.
compiler output:
1>Compiling...
1>main.cpp
1>.\main.cpp(3) : error C2011: '_STORAGE_QUERY_TYPE' : 'enum' type redefinition
1> C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winioctl.h(641) : see declaration of '_STORAGE_QUERY_TYPE'
1>.\main.cpp(9) : error C2011: '_STORAGE_PROPERTY_ID' : 'enum' type redefinition
1> C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winioctl.h(652) : see declaration of '_STORAGE_PROPERTY_ID'
1>.\main.cpp(13) : error C2011: '_STORAGE_PROPERTY_QUERY' : 'struct' type redefinition
1> C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winioctl.h(667) : see declaration of '_STORAGE_PROPERTY_QUERY'
1>.\main.cpp(34) : error C2011: '_STORAGE_DEVICE_DESCRIPTOR' : 'struct' type redefinition
1> C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winioctl.h(710) : see declaration of '_STORAGE_DEVICE_DESCRIPTOR'
1>.\main.cpp(259) : error C2079: 'query' uses undefined struct '_STORAGE_PROPERTY_QUERY'
1>.\main.cpp(263) : error C2228: left of '.PropertyId' must have class/struct/union
1> type is 'int'
1>.\main.cpp(264) : error C2228: left of '.QueryType' must have class/struct/union
1> type is 'int'
1>.\main.cpp(276) : error C2027: use of undefined type '_STORAGE_DEVICE_DESCRIPTOR'
1> C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winioctl.h(710) : see declaration of '_STORAGE_DEVICE_DESCRIPTOR'
1>.\main.cpp(276) : error C2227: left of '->SerialNumberOffset' must point to class/struct/union/generic type
1>.\main.cpp(282) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h(74) : see declaration of 'strcpy'
1>.\main.cpp(290) : warning C4172: returning address of local variable or temporary
1>Build log was saved at "file://c:\Users\Administrator\Desktop\c++ projects\keylogger\Release\BuildLog.htm"
1>keylogger - 9 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
sorry for the mass of code.. most of it is just struct declarations that probably aren't causing the problem.
the code:
#incude <stdio.h>
#include <windows.h>
typedef enum _STORAGE_QUERY_TYPE {
PropertyStandardQuery = 0, // Retrieves the descriptor
PropertyExistsQuery, // Used to test whether the descriptor is supported
PropertyMaskQuery, // Used to retrieve a mask of writeable fields in the descriptor
PropertyQueryMaxDefined // use to validate the value
} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
typedef enum _STORAGE_PROPERTY_ID {
StorageDeviceProperty = 0,
StorageAdapterProperty
} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
typedef struct _STORAGE_PROPERTY_QUERY {
//
// ID of the property being retrieved
//
STORAGE_PROPERTY_ID PropertyId;
//
// Flags indicating the type of query being performed
//
STORAGE_QUERY_TYPE QueryType;
//
// Space for additional parameters if necessary
//
UCHAR AdditionalParameters[1];
} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
typedef struct _STORAGE_DEVICE_DESCRIPTOR {
//
// Sizeof(STORAGE_DEVICE_DESCRIPTOR)
//
ULONG Version;
//
// Total size of the descriptor, including the space for additional
// data and id strings
//
ULONG Size;
//
// The SCSI-2 device type
//
UCHAR DeviceType;
//
// The SCSI-2 device type modifier (if any) - this may be zero
//
UCHAR DeviceTypeModifier;
//
// Flag indicating whether the device's media (if any) is removable. This
// field should be ignored for media-less devices
//
BOOLEAN RemovableMedia;
//
// Flag indicating whether the device can support mulitple outstanding
// commands. The actual synchronization in this case is the responsibility
// of the port driver.
//
BOOLEAN CommandQueueing;
//
// Byte offset to the zero-terminated ascii string containing the device's
// vendor id string. For devices with no such ID this will be zero
//
ULONG VendorIdOffset;
//
// Byte offset to the zero-terminated ascii string containing the device's
// product id string. For devices with no such ID this will be zero
//
ULONG ProductIdOffset;
//
// Byte offset to the zero-terminated ascii string containing the device's
// product revision string. For devices with no such string this will be
// zero
//
ULONG ProductRevisionOffset;
//
// Byte offset to the zero-terminated ascii string containing the device's
// serial number. For devices with no serial number this will be zero
//
ULONG SerialNumberOffset;
//
// Contains the bus type (as defined above) of the device. It should be
// used to interpret the raw device properties at the end of this structure
// (if any)
//
STORAGE_BUS_TYPE BusType;
//
// The number of bytes of bus-specific data which have been appended to
// this descriptor
//
ULONG RawPropertiesLength;
//
// Place holder for the first byte of the bus specific property data
//
UCHAR RawDeviceProperties[1];
} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
char * flipAndCodeBytes (const char * str,
int pos,
int flip,
char * buf)
{
int i;
int j = 0;
int k = 0;
buf [0] = '\0';
if (pos <= 0)
return buf;
if ( ! j)
{
char p = 0;
// First try to gather all characters representing hex digits only.
j = 1;
k = 0;
buf[k] = 0;
for (i = pos; j && str[i] != '\0'; ++i)
{
char c = tolower(str[i]);
if (isspace(c))
c = '0';
++p;
buf[k] <<= 4;
if (c >= '0' && c <= '9')
buf[k] |= (unsigned char) (c - '0');
else if (c >= 'a' && c <= 'f')
buf[k] |= (unsigned char) (c - 'a' + 10);
else
{
j = 0;
break;
}
if (p == 2)
{
if (buf[k] != '\0' && ! isprint(buf[k]))
{
j = 0;
break;
}
++k;
p = 0;
buf[k] = 0;
}
}
}
if ( ! j)
{
// There are non-digit characters, gather them as is.
j = 1;
k = 0;
for (i = pos; j && str[i] != '\0'; ++i)
{
char c = str[i];
if ( ! isprint(c))
{
j = 0;
break;
}
buf[k++] = c;
}
}
if ( ! j)
{
// The characters are not there or are not printable.
k = 0;
}
buf[k] = '\0';
if (flip)
// Flip adjacent characters
for (j = 0; j < k; j += 2)
{
char t = buf[j];
buf[j] = buf[j + 1];
buf[j + 1] = t;
}
// Trim any beginning and end space
i = j = -1;
for (k = 0; buf[k] != '\0'; ++k)
{
if (! isspace(buf[k]))
{
if (i < 0)
i = k;
j = k;
}
}
if ((i >= 0) && (j >= 0))
{
for (k = i; (k <= j) && (buf[k] != '\0'); ++k)
buf[k - i] = buf[k];
buf[k - i] = '\0';
}
return buf;
}
char * HDSerialNumber ()
{
char HardDriveSerialNumber [1024];
char serialNumber [1000];
int done = FALSE;
int drive = 0;
for (drive = 0; drive < 16; drive++)
{
HANDLE hPhysicalDriveIOCTL = 0;
char driveName [256];
sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);
hPhysicalDriveIOCTL = CreateFile (driveName, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
{
STORAGE_PROPERTY_QUERY query;
DWORD cbBytesReturned = 0;
char buffer [10000];
memset ((void *) & query, 0, sizeof (query));
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;
memset (buffer, 0, sizeof (buffer));
if ( DeviceIoControl (hPhysicalDriveIOCTL, CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS),
& query,
sizeof (query),
& buffer,
sizeof (buffer),
& cbBytesReturned, NULL) )
{
STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & buffer;
flipAndCodeBytes (buffer,
descrip -> SerialNumberOffset,
1, serialNumber );
if (0 == HardDriveSerialNumber [0] &&
(isalnum (serialNumber [0]) || isalnum (serialNumber [19])))
{
strcpy (HardDriveSerialNumber, serialNumber);
done = TRUE;
}
memset (buffer, 0, sizeof(buffer));
}
CloseHandle (hPhysicalDriveIOCTL);
}
}
return serialNumber;
}
void main()
{
printf(HDSerialNumber());
}
thanks a bunch