diff options
author | Christophe Grenier <[email protected]> | 2008-04-11 11:45:06 +0200 |
---|---|---|
committer | Christophe Grenier <[email protected]> | 2008-04-11 11:45:06 +0200 |
commit | b62aab4cde8ec4b2296b40ab05014ee3e9c01854 (patch) | |
tree | ff0d8fa7651a23dda50d395248bcd234dd8cfd71 /src/hdwin32.c | |
parent | ef4cf90c9405b38b39ec1b033cd17e5a0f4eb65e (diff) |
Reorganize how disk geometry, size and sector size is gathered
Diffstat (limited to 'src/hdwin32.c')
-rw-r--r-- | src/hdwin32.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/hdwin32.c b/src/hdwin32.c new file mode 100644 index 00000000..d79ae27a --- /dev/null +++ b/src/hdwin32.c @@ -0,0 +1,121 @@ +/* + + File: hdwin32.c + + Copyright (C) 2008 Christophe GRENIER <[email protected]> + + This software is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write the Free Software Foundation, Inc., 51 + Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#if defined(__CYGWIN__) || defined(__MINGW32__) +#include "types.h" +#include "common.h" +#ifdef HAVE_STDLIB_H +#include <stdlib.h> /* free */ +#endif +#ifdef HAVE_WINDEF_H +#include <windef.h> +#endif +#ifdef HAVE_WINBASE_H +#include <stdarg.h> +#include <winbase.h> +#endif +#include <ctype.h> /* isspace */ +#ifdef HAVE_W32API_DDK_NTDDDISK_H +#include <w32api/ddk/ntdddisk.h> +#endif +#ifdef HAVE_DDK_NTDDSTOR_H +#include <ddk/ntddstor.h> +#endif +#include "fnctdsk.h" +#include "log.h" +#include "hdwin32.h" + +void file_win32_disk_get_model(HANDLE handle, disk_t *dev, const int verbose) +{ +#ifdef IOCTL_STORAGE_QUERY_PROPERTY + DWORD cbBytesReturned = 0; + STORAGE_PROPERTY_QUERY query; + char buffer [10240]; + memset((void *) & query, 0, sizeof (query)); + query.PropertyId = StorageDeviceProperty; + query.QueryType = PropertyStandardQuery; + memset(&buffer, 0, sizeof (buffer)); + + if ( DeviceIoControl(handle, IOCTL_STORAGE_QUERY_PROPERTY, + &query, + sizeof (query), + &buffer, + sizeof (buffer), + &cbBytesReturned, NULL) ) + { + const STORAGE_DEVICE_DESCRIPTOR * descrip = (const STORAGE_DEVICE_DESCRIPTOR *) & buffer; + const unsigned int offsetVendor=descrip->VendorIdOffset; + const unsigned int offsetProduct=descrip->ProductIdOffset; + unsigned int lenVendor=0; + unsigned int lenProduct=0; + if(verbose>1) + { + log_info("IOCTL_STORAGE_QUERY_PROPERTY:\n"); + dump_log(&buffer, cbBytesReturned); + } + if(offsetVendor>0) + { + for(lenVendor=0; offsetVendor+lenVendor < sizeof(buffer) && + offsetVendor+lenVendor < cbBytesReturned && + buffer[offsetVendor+lenVendor] != '\0'; + lenVendor++); + } + if(offsetProduct>0) + { + for(lenProduct=0; offsetProduct+lenProduct < sizeof(buffer) && + offsetProduct+lenProduct < cbBytesReturned && + buffer[offsetProduct+lenProduct] != '\0'; + lenProduct++); + } + + if(lenVendor+lenProduct>0) + { + int i; + dev->model = (char*) MALLOC(lenVendor+1+lenProduct+1); + dev->model[0]='\0'; + if(lenVendor>0) + { + memcpy(dev->model, &buffer[offsetVendor], lenVendor); + dev->model[lenVendor]='\0'; + for(i=lenVendor-1;i>=0 && dev->model[i]==' ';i--); + if(i>=0) + dev->model[++i]=' '; + dev->model[++i]='\0'; + } + if(lenProduct>0) + { + strncat(dev->model, &buffer[offsetProduct],lenProduct); + for(i=strlen(dev->model)-1;i>=0 && dev->model[i]==' ';i--); + dev->model[++i]='\0'; + } + if(strlen(dev->model)>0) + return ; + free(dev->model); + dev->model=NULL; + } + } +#endif +} +#endif |