读取USB HDD(USB移动硬盘)序列号的代码,型号及分位。

使用Visual Studio 2010编译成功。

代码使用了CrystalDiskInfo中的代码smartata.c中相关代码:

例如以下的连接解释了为何使用scsi的相关代码。须要USB IC的数据转换。

http://blog.csdn.net/waityoualife/article/details/5656589

实现代码例如以下:

// DiskInfo.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winioctl.h>
#include <stddef.h>
#include <memory.h> #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) typedef struct _IDENTIFY_DEVICE{
WORD GeneralConfiguration; //0
WORD LogicalCylinders; //1 Obsolete
WORD SpecificConfiguration; //2
WORD LogicalHeads; //3 Obsolete
WORD Retired1[2]; //4-5
WORD LogicalSectors; //6 Obsolete
DWORD ReservedForCompactFlash; //7-8
WORD Retired2; //9
CHAR SerialNumber[20]; //10-19
WORD Retired3; //20
WORD BufferSize; //21 Obsolete
// WORD Obsolute4; //22
CHAR FirmwareRev[8]; //23-26
CHAR Model[40]; //27-46
WORD MaxNumPerInterupt; //47
WORD Reserved1; //48
WORD Capabilities1; //49
WORD Capabilities2; //50
DWORD Obsolute5; //51-52
WORD Field88and7064; //53
WORD Obsolute6[5]; //54-58
WORD MultSectorStuff; //59
DWORD TotalAddressableSectors; //60-61
WORD Obsolute7; //62
WORD MultiWordDma; //63
WORD PioMode; //64
WORD MinMultiwordDmaCycleTime; //65
WORD RecommendedMultiwordDmaCycleTime; //66
WORD MinPioCycleTimewoFlowCtrl; //67
WORD MinPioCycleTimeWithFlowCtrl; //68
WORD Reserved2[6]; //69-74
WORD QueueDepth; //75
WORD SerialAtaCapabilities; //76
WORD SerialAtaAdditionalCapabilities; //77
WORD SerialAtaFeaturesSupported; //78
WORD SerialAtaFeaturesEnabled; //79
WORD MajorVersion; //80
WORD MinorVersion; //81
WORD CommandSetSupported1; //82
WORD CommandSetSupported2; //83
WORD CommandSetSupported3; //84
WORD CommandSetEnabled1; //85
WORD CommandSetEnabled2; //86
WORD CommandSetDefault; //87
WORD UltraDmaMode; //88
WORD TimeReqForSecurityErase; //89
WORD TimeReqForEnhancedSecure; //90
WORD CurrentPowerManagement; //91
WORD MasterPasswordRevision; //92
WORD HardwareResetResult; //93
WORD AcoustricManagement; //94
WORD StreamMinRequestSize; //95
WORD StreamingTimeDma; //96
WORD StreamingAccessLatency; //97
DWORD StreamingPerformance; //98-99
ULONGLONG MaxUserLba; //100-103
WORD StremingTimePio; //104
WORD Reserved3; //105
WORD SectorSize; //106
WORD InterSeekDelay; //107
WORD IeeeOui; //108
WORD UniqueId3; //109
WORD UniqueId2; //110
WORD UniqueId1; //111
WORD Reserved4[4]; //112-115
WORD Reserved5; //116
DWORD WordsPerLogicalSector; //117-118
WORD Reserved6[8]; //119-126
WORD RemovableMediaStatus; //127
WORD SecurityStatus; //128
WORD VendorSpecific[31]; //129-159
WORD CfaPowerMode1; //160
WORD ReservedForCompactFlashAssociation[7]; //161-167
WORD DeviceNominalFormFactor; //168
WORD DataSetManagement; //169
WORD AdditionalProductIdentifier[4]; //170-173
WORD Reserved7[2]; //174-175
CHAR CurrentMediaSerialNo[60]; //176-205
WORD SctCommandTransport; //206
WORD ReservedForCeAta1[2]; //207-208
WORD AlignmentOfLogicalBlocks; //209
DWORD WriteReadVerifySectorCountMode3; //210-211
DWORD WriteReadVerifySectorCountMode2; //212-213
WORD NvCacheCapabilities; //214
DWORD NvCacheSizeLogicalBlocks; //215-216
WORD NominalMediaRotationRate; //217
WORD Reserved8; //218
WORD NvCacheOptions1; //219
WORD NvCacheOptions2; //220
WORD Reserved9; //221
WORD TransportMajorVersionNumber; //222
WORD TransportMinorVersionNumber; //223
WORD ReservedForCeAta2[10]; //224-233
WORD MinimumBlocksPerDownloadMicrocode; //234
WORD MaximumBlocksPerDownloadMicrocode; //235
WORD Reserved10[19]; //236-254
WORD IntegrityWord; //255
}IDENTIFY_DEVICE; typedef enum _COMMAND_TYPE
{
CMD_TYPE_PHYSICAL_DRIVE = 0,
CMD_TYPE_SCSI_MINIPORT,
CMD_TYPE_SILICON_IMAGE,
CMD_TYPE_SAT, // SAT = SCSI_ATA_TRANSLATION
CMD_TYPE_SUNPLUS,
CMD_TYPE_IO_DATA,
CMD_TYPE_LOGITEC,
CMD_TYPE_JMICRON,
CMD_TYPE_CYPRESS,
CMD_TYPE_PROLIFIC, // Not imprement
CMD_TYPE_CSMI, // CSMI = Common Storage Management Interface
CMD_TYPE_CSMI_PHYSICAL_DRIVE, // CSMI = Common Storage Management Interface
CMD_TYPE_WMI,
CMD_TYPE_DEBUG
}COMMAND_TYPE; // retrieve the properties of a storage device or adapter.
typedef enum _STORAGE_QUERY_TYPE {
PropertyStandardQuery = 0,
PropertyExistsQuery,
PropertyMaskQuery,
PropertyQueryMaxDefined
} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE; // retrieve the properties of a storage device or adapter. typedef struct _STORAGE_PROPERTY_QUERY {
STORAGE_PROPERTY_ID PropertyId;
STORAGE_QUERY_TYPE QueryType;
UCHAR AdditionalParameters[1];
} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY; #define FILE_DEVICE_SCSI 0x0000001b
#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
#define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502)
#define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503)
#define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504)
#define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505) #define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER
#define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) //
// Define values for pass-through DataIn field.
//
#define SCSI_IOCTL_DATA_OUT 0
#define SCSI_IOCTL_DATA_IN 1
#define SCSI_IOCTL_DATA_UNSPECIFIED 2 //
// Define the SCSI pass through structure.
//
typedef struct _SCSI_PASS_THROUGH {
USHORT Length;
UCHAR ScsiStatus;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR CdbLength;
UCHAR SenseInfoLength;
UCHAR DataIn;
ULONG DataTransferLength;
ULONG TimeOutValue;
ULONG_PTR DataBufferOffset;
ULONG SenseInfoOffset;
UCHAR Cdb[16];
}SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH; typedef struct _SCSI_PASS_THROUGH_WITH_BUFFERS {
SCSI_PASS_THROUGH Spt;
ULONG Filler; // realign buffers to double word boundary
UCHAR SenseBuf[32];
UCHAR DataBuf[512];
} SCSI_PASS_THROUGH_WITH_BUFFERS, *PSCSI_PASS_THROUGH_WITH_BUFFERS; static void dump_buffer(const char* title, const unsigned char* buffer, int len)
{
int i = 0;
int j; printf ("\n-- %s --\n", title);
if (len > 0)
{
printf ("%8.8s ", " ");
for (j = 0; j < 16; ++j)
{
printf (" %2X", j);
}
printf (" ");
for (j = 0; j < 16; ++j)
{
printf ("%1X", j);
}
printf ("\n");
}
while (i < len)
{
printf("%08x ", i);
for (j = 0; j < 16; ++j)
{
if ((i + j) < len)
printf (" %02x", (int) buffer[i +j]);
else
printf (" ");
}
printf (" ");
for (j = 0; j < 16; ++j)
{
if ((i + j) < len)
printf ("%c", isprint (buffer[i + j]) ? buffer [i + j] : '.');
else
printf (" ");
}
printf ("\n");
i += 16;
}
printf ("-- DONE --\n");
} void ChangeByteOrder(PCHAR szString, USHORT uscStrSize)
{
USHORT i;
CHAR temp; for (i = 0; i < uscStrSize; i+=2)
{
temp = szString[i];
szString[i] = szString[i+1];
szString[i+1] = temp;
}
} BOOL DoIdentifyDeviceSat(HANDLE physicalDriveId, BYTE target, IDENTIFY_DEVICE* data, COMMAND_TYPE type)
{
BOOL bRet;
HANDLE hIoCtrl;
DWORD dwReturned;
DWORD length; SCSI_PASS_THROUGH_WITH_BUFFERS sptwb; if(data == NULL)
{
printf("Data\n");
return FALSE;
} ZeroMemory(data, sizeof(IDENTIFY_DEVICE)); hIoCtrl = physicalDriveId;
if(hIoCtrl == INVALID_HANDLE_VALUE)
{
printf("Handle\n");
return FALSE;
} ZeroMemory(&sptwb,sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS)); sptwb.Spt.Length = sizeof(SCSI_PASS_THROUGH);
sptwb.Spt.PathId = 0;
sptwb.Spt.TargetId = 0;
sptwb.Spt.Lun = 0;
sptwb.Spt.SenseInfoLength = 24;
sptwb.Spt.DataIn = SCSI_IOCTL_DATA_IN;
sptwb.Spt.DataTransferLength = IDENTIFY_BUFFER_SIZE;
sptwb.Spt.TimeOutValue = 2;
sptwb.Spt.DataBufferOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS, DataBuf);
sptwb.Spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS, SenseBuf); if(type == CMD_TYPE_SAT)
{
sptwb.Spt.CdbLength = 12;
sptwb.Spt.Cdb[0] = 0xA1;//ATA PASS THROUGH(12) OPERATION CODE(A1h)
sptwb.Spt.Cdb[1] = (4 << 1) | 0; //MULTIPLE_COUNT=0,PROTOCOL=4(PIO Data-In),Reserved
sptwb.Spt.Cdb[2] = (1 << 3) | (1 << 2) | 2;//OFF_LINE=0,CK_COND=0,Reserved=0,T_DIR=1(ToDevice),BYTE_BLOCK=1,T_LENGTH=2
sptwb.Spt.Cdb[3] = 0;//FEATURES (7:0)
sptwb.Spt.Cdb[4] = 1;//SECTOR_COUNT (7:0)
sptwb.Spt.Cdb[5] = 0;//LBA_LOW (7:0)
sptwb.Spt.Cdb[6] = 0;//LBA_MID (7:0)
sptwb.Spt.Cdb[7] = 0;//LBA_HIGH (7:0)
sptwb.Spt.Cdb[8] = target;
sptwb.Spt.Cdb[9] = 0xEC;//COMMAND
}
else if(type == CMD_TYPE_SUNPLUS)
{
sptwb.Spt.CdbLength = 12;
sptwb.Spt.Cdb[0] = 0xF8;
sptwb.Spt.Cdb[1] = 0x00;
sptwb.Spt.Cdb[2] = 0x22;
sptwb.Spt.Cdb[3] = 0x10;
sptwb.Spt.Cdb[4] = 0x01;
sptwb.Spt.Cdb[5] = 0x00;
sptwb.Spt.Cdb[6] = 0x01;
sptwb.Spt.Cdb[7] = 0x00;
sptwb.Spt.Cdb[8] = 0x00;
sptwb.Spt.Cdb[9] = 0x00;
sptwb.Spt.Cdb[10] = target;
sptwb.Spt.Cdb[11] = 0xEC; // ID_CMD
}
else if(type == CMD_TYPE_IO_DATA)
{
sptwb.Spt.CdbLength = 12;
sptwb.Spt.Cdb[0] = 0xE3;
sptwb.Spt.Cdb[1] = 0x00;
sptwb.Spt.Cdb[2] = 0x00;
sptwb.Spt.Cdb[3] = 0x01;
sptwb.Spt.Cdb[4] = 0x01;
sptwb.Spt.Cdb[5] = 0x00;
sptwb.Spt.Cdb[6] = 0x00;
sptwb.Spt.Cdb[7] = target;
sptwb.Spt.Cdb[8] = 0xEC; // ID_CMD
sptwb.Spt.Cdb[9] = 0x00;
sptwb.Spt.Cdb[10] = 0x00;
sptwb.Spt.Cdb[11] = 0x00;
}
else if(type == CMD_TYPE_LOGITEC)
{
sptwb.Spt.CdbLength = 10;
sptwb.Spt.Cdb[0] = 0xE0;
sptwb.Spt.Cdb[1] = 0x00;
sptwb.Spt.Cdb[2] = 0x00;
sptwb.Spt.Cdb[3] = 0x00;
sptwb.Spt.Cdb[4] = 0x00;
sptwb.Spt.Cdb[5] = 0x00;
sptwb.Spt.Cdb[6] = 0x00;
sptwb.Spt.Cdb[7] = target;
sptwb.Spt.Cdb[8] = 0xEC; // ID_CMD
sptwb.Spt.Cdb[9] = 0x4C;
}
else if(type == CMD_TYPE_JMICRON)
{
sptwb.Spt.CdbLength = 12;
sptwb.Spt.Cdb[0] = 0xDF;
sptwb.Spt.Cdb[1] = 0x10;
sptwb.Spt.Cdb[2] = 0x00;
sptwb.Spt.Cdb[3] = 0x02;
sptwb.Spt.Cdb[4] = 0x00;
sptwb.Spt.Cdb[5] = 0x00;
sptwb.Spt.Cdb[6] = 0x01;
sptwb.Spt.Cdb[7] = 0x00;
sptwb.Spt.Cdb[8] = 0x00;
sptwb.Spt.Cdb[9] = 0x00;
sptwb.Spt.Cdb[10] = target;
sptwb.Spt.Cdb[11] = 0xEC; // ID_CMD
}
else if(type == CMD_TYPE_CYPRESS)
{
sptwb.Spt.CdbLength = 16;
sptwb.Spt.Cdb[0] = 0x24;
sptwb.Spt.Cdb[1] = 0x24;
sptwb.Spt.Cdb[2] = 0x00;
sptwb.Spt.Cdb[3] = 0xBE;
sptwb.Spt.Cdb[4] = 0x01;
sptwb.Spt.Cdb[5] = 0x00;
sptwb.Spt.Cdb[6] = 0x00;
sptwb.Spt.Cdb[7] = 0x01;
sptwb.Spt.Cdb[8] = 0x00;
sptwb.Spt.Cdb[9] = 0x00;
sptwb.Spt.Cdb[10] = 0x00;
sptwb.Spt.Cdb[11] = target;
sptwb.Spt.Cdb[12] = 0xEC; // ID_CMD
sptwb.Spt.Cdb[13] = 0x00;
sptwb.Spt.Cdb[14] = 0x00;
sptwb.Spt.Cdb[15] = 0x00;
}
else
{
return FALSE;
} length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS, DataBuf) + sptwb.Spt.DataTransferLength; bRet = DeviceIoControl(hIoCtrl, IOCTL_SCSI_PASS_THROUGH,
&sptwb, sizeof(SCSI_PASS_THROUGH),
&sptwb, length, &dwReturned, NULL); CloseHandle(hIoCtrl); if(bRet == FALSE || dwReturned != length)
{
return FALSE;
} memcpy(data, sptwb.DataBuf, sizeof(IDENTIFY_DEVICE)); return TRUE;
} int main(int argc, char *argv[]) {
HANDLE hDevice=NULL;
STORAGE_PROPERTY_QUERY sQuery;
STORAGE_DEVICE_DESCRIPTOR* pDescriptor;
char *model, *firmware, *serialnumber;
char usb_hdd_model[41], usb_hdd_firmware[9], usb_hdd_Serialnumber[21];
IDENTIFY_DEVICE identify = {0};
char pcbData[4096];
int dwLen = 4096;
DWORD dwRet;
BOOL bRet; hDevice=CreateFileA("\\\\.\\PhysicalDrive1",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if(hDevice==INVALID_HANDLE_VALUE)
{
fprintf(stderr, "CreateFile()\n");
exit(1);
} memset(pcbData, 0, 4096);
sQuery.PropertyId = StorageDeviceProperty;
sQuery.QueryType = PropertyStandardQuery; bRet = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &sQuery, sizeof(STORAGE_PROPERTY_QUERY), pcbData,dwLen,&dwRet,NULL);
if(bRet){
pDescriptor = (STORAGE_DEVICE_DESCRIPTOR*)pcbData;
if(pDescriptor->BusType == BusTypeUsb)
{
printf("USB-Type\n");
} if(pDescriptor->ProductIdOffset)
{
model = (char*)pDescriptor + pDescriptor->ProductIdOffset;
printf("Model: %s\n", model);
}
if(pDescriptor->ProductRevisionOffset)
{
firmware = (char*)pDescriptor + pDescriptor->ProductRevisionOffset;
printf("Firmware: %s\n", firmware);
}
if(pDescriptor->SerialNumberOffset)
{
serialnumber = (char*)pDescriptor + pDescriptor->SerialNumberOffset;
printf("Serial number: %s\n", serialnumber);
}
}
/*
CMD_TYPE_SAT, // SAT = SCSI_ATA_TRANSLATION
CMD_TYPE_SUNPLUS,
CMD_TYPE_IO_DATA,
CMD_TYPE_LOGITEC,
CMD_TYPE_JMICRON,
CMD_TYPE_CYPRESS,
*/
if(DoIdentifyDeviceSat(hDevice, 0xa0, &identify, CMD_TYPE_SAT)){
printf("0xA0-CMD_TYPE_SAT-Return ok");
}
else if(DoIdentifyDeviceSat(hDevice, 0xa0, &identify, CMD_TYPE_SUNPLUS)){
printf("0xA0-CMD_TYPE_SUNPLUS-Return ok");
}
else if(DoIdentifyDeviceSat(hDevice, 0xa0, &identify, CMD_TYPE_IO_DATA)){
printf("0xA0-CMD_TYPE_IO_DATA-Return ok");
}
else if(DoIdentifyDeviceSat(hDevice, 0xa0, &identify, CMD_TYPE_LOGITEC)){
printf("0xA0-CMD_TYPE_LOGITEC-Return ok");
}
else if(DoIdentifyDeviceSat(hDevice, 0xa0, &identify, CMD_TYPE_JMICRON)){
printf("0xA0-CMD_TYPE_JMICRON-Return ok");
}
else if(DoIdentifyDeviceSat(hDevice, 0xb0, &identify, CMD_TYPE_SAT)){
printf("0xB0-CMD_TYPE_SAT-Return ok");
}
else if(DoIdentifyDeviceSat(hDevice, 0xb0, &identify, CMD_TYPE_SUNPLUS)){
printf("0xB0-CMD_TYPE_SUNPLUS-Return ok");
}
else if(DoIdentifyDeviceSat(hDevice, 0xb0, &identify, CMD_TYPE_IO_DATA)){
printf("0xB0-CMD_TYPE_IO_DATA-Return ok");
}
else if(DoIdentifyDeviceSat(hDevice, 0xb0, &identify, CMD_TYPE_LOGITEC)){
printf("0xB0-CMD_TYPE_LOGITEC-Return ok");
}
else if(DoIdentifyDeviceSat(hDevice, 0xb0, &identify, CMD_TYPE_JMICRON)){
printf("0xB0-CMD_TYPE_JMICRON-Return ok");
}else{
printf("Return ng\n");
} #define debug 0
#if debug
dump_buffer("data", (const unsigned char *)&identify, sizeof(IDENTIFY_DEVICE));
#endif memcpy(usb_hdd_model, identify.Model, 40);
ChangeByteOrder(usb_hdd_model, 40);
usb_hdd_model[40]='\0'; memcpy(usb_hdd_firmware, identify.FirmwareRev, 8);
ChangeByteOrder(usb_hdd_firmware, 8);
usb_hdd_firmware[8]='\0'; memcpy(usb_hdd_Serialnumber, identify.SerialNumber, 20);
ChangeByteOrder(usb_hdd_Serialnumber, 20);
usb_hdd_Serialnumber[20]='\0'; printf("\nUSB-HDD Model name: %s", usb_hdd_model);
printf("\nUSB-HDD Firmware Rev: %s", usb_hdd_firmware);
printf("\nUSB-HDD Serial number: %s", usb_hdd_Serialnumber);
return 0;
}

读取USB HDD(USB移动硬盘信息)序列号的代码的更多相关文章

  1. USB device & USB controller & USB passthrough

    目录 USB device USB controller Linux 相关命令 Python 相关库 Libvirt USB passthrough 参考资料 近期往 openstack 里倒腾 US ...

  2. USB:USB通信中的端点(endpoint)和四种传输模式

    USB的传输模式有4种,分别是控制传输(Control Transfer).中断传输(Interrupt Transfer).批量传输或叫块传输(Bulk Transfer).实时传输或叫同步传输(I ...

  3. 读取 android sys/下的信息

    读取 android sys/下的信息 https://github.com/ruw/Internet-Services-projects/tree/master/OffloadPredictor/l ...

  4. vc弹出USB的方法. 附试验通过的代码!

    vc弹出USB的方法. 附试验通过的代码! http://blog.sina.com.cn/s/blog_4fcd1ea30100qrzn.html (2011-04-15 10:09:48) boo ...

  5. 【坑】springMvc 信息校验,读取不到错误配置信息的问题

    文章目录 前言 ResourceBundleMessageSource 后记 前言 springMvc 的一大利器,validation 检验,通过注解,可以帮我们完成校验,很是顺手. 终极偷懒检验, ...

  6. 如何使用Hasu USB to USB Controller Converter刷写tmk固件交换Caps和Ctrl

    相关链接 购买Hasu USB to USB Controller Converter:https://www.1upkeyboards.com/shop/controllers/usb-to-usb ...

  7. 读取手机中的联系人信息(android.provider.ContactsContract)

    本篇开始讲如何从Android中得到本机联系人的信息.由于Android较快的版本升级,部分API已经发生了变化.本篇探究的通过ContentProvider机制获取联系人的API从Android2. ...

  8. 使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像

    借助VS2013和OpenCV的绘图功能,在工程DICOMReader.sln中实现了对单张.dcm图像的读取与显示,以下是详细步骤. 前期准备工作 编译器:VS2013 库:dcmtk-3.6.0( ...

  9. C#中创建、打开、读取、写入、保存Excel的一般性代码

    ---转载:http://hi.baidu.com/zhaocbo/item/e840bcf941932d15fe358228 1. Excel对象微软的Excel对象模型包括了128个不同的对象,从 ...

随机推荐

  1. C语言声明解析方法

    1.C语言声明的单独语法成份     声明器是C语言声明的非常重要成份,他是所有声明的核心内容,简单的说:声明器就是标识符以及与它组合在一起的任何指针.函数括号.数组下表等,为了方便起见这里进行分类表 ...

  2. poj3617Best Cow Line

    题意大概是这样,给你一个字符串,你能够进行的操作是这种, 每次拿走这个串的第一个字母,或者最后一个字母,然后放到 一个新串的末尾(当然啦,新串一開始是为空的),当把旧串 里的全部字母拿掉,这个时候就形 ...

  3. 实现文件下载的java代码

    实现文件下载的java代码 //这是实现下载类(servlet),详细思路代码例如以下://也可连接数据库package com.message; import javax.servlet.*;imp ...

  4. ubuntu 安装maven提示出错 The program &#39;mvn&#39; can be found in the following packages

    问题: I am trying to install apache maven 3 in Ubuntu 12.04 lts. What I did was open the terminal then ...

  5. Metasploit学习之msf连接数据库

    kali使用metasploit开启数据服务: 首先,初次使用系统要初始化建立数据库msf3, 否则的话 /opt/metasploit/apps/pro/ui/config/databse.yml不 ...

  6. PLSQL数据导入

    导入数据 (1)      首先以管理员身份登录plsql; (2)      新建命令窗口 (3)      创建用户,设置帐号,密码 创建语句:create user usernameidenti ...

  7. 老罗android开发视频教程 下载地址

    感觉老罗android开发视频教程讲得挺好挺全面的,适合新手学习.分享 老罗android开发视频教程 下载地址: 电驴:http://www.verycd.com/topics/2929580/ 老 ...

  8. MongoDB学习笔记(五) MongoDB文件存取操作

    由于MongoDB的文档结构为BJSON格式(BJSON全称:Binary JSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结 ...

  9. 【安卓】eclipse中不可错过的几个秘密、!

    1.PackageExplorer显示文件层次的默认方式是平行列出全部包,事实上也可显示成多级,并且效果比navigator好多了. PackageExplorer视图中,"右上角箭头→pa ...

  10. Mac OS X将CSV格式转换为Excel文档格式,Excel转CSV中文乱码问题

    一:在Mac上假设你使用Excel打开windows导出的CSV格式文档.你会发现表格中全部的的内容都显示在A列. 那么,怎样恢复正常呢,你能够将CSV格式的文档导入到Excel文档中,这样就正常显示 ...