📄 xpok.cpp
字号:
// Exclude rarely-used stuff from Windows headers
#include <iostream.h>
#include "windows.h"
#include "stdio.h"
#include "stdlib.h"
//#pragma comment(lib, "advapi32")
#define NTAPI __stdcall
typedef int NTSTATUS;
//swsw--------------------------------------
//----------------------------------------------
typedef enum _SYSDBG_COMMAND
{
SysDbgSysReadIoSpace = 14,
SysDbgSysWriteIoSpace = 15
}SYSDBG_COMMAND, *PSYSDBG_COMMAND;
typedef NTSTATUS (NTAPI * PZwSystemDebugControl) (
SYSDBG_COMMAND ControlCode,
PVOID InputBuffer,
ULONG InputBufferLength,
PVOID OutputBuffer,
ULONG OutputBufferLength,
PULONG ReturnLength
);
PZwSystemDebugControl ZwSystemDebugControl = NULL;
typedef struct _IO_STRUCT
{
DWORD IoAddr; // IN: Aligned to NumBYTEs,I/O address
DWORD Reserved1; // Never accessed by the kernel
PVOID pBuffer; // IN (write) or OUT (read): Ptr to buffer
DWORD NumBYTEs; // IN: # BYTEs to read/write. Only use 1, 2, or 4.
DWORD Reserved4; // Must be 1
DWORD Reserved5; // Must be 0
DWORD Reserved6; // Must be 1
DWORD Reserved7; // Never accessed by the kernel
} IO_STRUCT, *PIO_STRUCT;
/*=============================================*/
//#pragma pack(1)
typedef struct _IDSECTOR {
unsigned short wGenConfig; //0 一般信息
unsigned short wNumCyls; //1 圆柱体的数目
unsigned short wReserved; //2 保留
unsigned short wNumHeads; //3 磁头的数目
unsigned short wBytesPerTrack; //4 隐退的
unsigned short wBytesPerSector; //5 隐退的
unsigned short wSectorsPerTrack; //6 逻辑扇区的数目
unsigned short wVendorUnique[3]; // 7 8 为指定协会保留? 9隐退的
unsigned char sSerialNumber[10]; //10---19 序号 (20个 ASCII 字符)
unsigned short wBufferType; //20 隐退的
unsigned short wBufferSize; //21 隐退的
unsigned short wECCSize; //22 废除
unsigned char sFirmwareRev[8]; //23---26 框架校订 (8个 ASCII 字符)
unsigned char sModelNumber[40]; //27---46 模型数 (40个 ASCII 字符)
unsigned short wMoreVendorUnique;//47
unsigned short wDoubleWordIO; //48
unsigned short wCapabilities; //49
unsigned short wReserved1; //50
unsigned short wPIOTiming; //51
unsigned short wDMATiming; //52
unsigned short wBS; //53
unsigned short wNumCurrentCyls; //54 目前圆柱体的数目
unsigned short wNumCurrentHeads; //55 目前磁头的数目
unsigned short wNumCurrentSectorsPerTrack;//56 目前每轨道扇区的数目
unsigned short ulCurrentSector[2]; //57--58 目前扇区的总数目
unsigned short wMultSectorStuff; //59
unsigned short leSectors[2]; //60--61 使用者可设定位址的扇区总数 (只有 LBA 模态)
unsigned short wSingleWordDMA; //62
unsigned short wMultiWordDMA; //63
unsigned short PIO; //64 高阶 PIO 模态支援
unsigned short sw1; //65
unsigned short sw2; //66
unsigned short sw3; //67
unsigned short sw4; //68
unsigned short sw5[2]; //69--70 保留 (对于未来指令重叠和排队)
unsigned short sw6[4]; //71--74 为认明小包装置指令保留。
unsigned short sw7; //75 储列深度
unsigned short sw8[4]; //76--79 保留
unsigned short sw9; //80 主修版号 0000 h 或 FFFFh 不报告版号
/* 15 沉默寡言的
14 为 ATA/ATAPI-14 保留
13 为 ATA/ATAPI-13 保留
12 为 ATA/ATAPI-12 保留
11 为 ATA/ATAPI-11 保留
10 为 ATA/ATAPI-10 保留
9 为 ATA/ATAPI-9 保留
8 为 ATA/ATAPI-8 保留
7 为 ATA/ATAPI-7 保留
6 为 ATA/ATAPI-6 保留
5 1= 支援 ATA/ATAPI-5
4 1= 支援 ATA/ATAPI-4
3 1= 支援 ATA-3
2 1= 支援 ATA-2
1 废语
0 保留*/
unsigned short sw10; //81 较小的版号0000 h 或 FFFFh=不报告版本
unsigned short sw11; //82 指令支援。
unsigned short sw12; //83 指令支援。
unsigned short sw13; //84 固定的指令/ 功能扩充。
unsigned short sw14; //85 固定的指令/ 功能扩充。
unsigned short sw15; //86 固定的指令/ 功能扩充。
unsigned short sw16; //87 固定的指令/ 功能扩充。
unsigned short sw17; //88 Ultra DMA
unsigned short sw18; //89 安全[性] 所需的时间抹掉单位完成
unsigned short sw19; //90 可提高的安全[性] 所需的时间抹掉完成
unsigned short sw20; //91 能力管理数值
unsigned short sw21[35]; //92 -- 126 保留
unsigned short sw22; //127 设定的可移动的介质状态通知功能支援
unsigned short sw23; //128 安全 状态
/*
15-9 保留
8 安全层次 0= 高度,1= 最大值
7-6 保留
5 可提高的 1= 安全抹掉支援
4 1= 安全[性] 计数期满
3 1= 冻结的安全[性]
2 1= 安全 锁
1 1= 安全 激活
0 1= 安全 支援
*/
unsigned short bReserved[127];
} IDSECTOR, *PIDSECTOR;
/*==========================================*/
BOOL EnablePrivilege (PCSTR name)
{
HANDLE hToken;
BOOL rv;
TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };
//查巡特权变量价值
LookupPrivilegeValue (
0,
name,
&priv.Privileges[0].Luid
);
//打开进程权标
OpenProcessToken(
/*得到现在的进程*/
GetCurrentProcess (),
TOKEN_ADJUST_PRIVILEGES,
&hToken
);
//调整权标特权
AdjustTokenPrivileges (
hToken,
FALSE,
&priv,
sizeof priv,
0,
0
);
rv = GetLastError () == ERROR_SUCCESS;
CloseHandle (hToken);
return rv;
}
BYTE InPortB (int Port)
{
BYTE Value;
IO_STRUCT io;
io.IoAddr = Port;
io.Reserved1 = 0;
io.pBuffer = (PVOID) (PULONG) & Value;
io.NumBYTEs = sizeof (BYTE);
io.Reserved4 = 1;
io.Reserved5 = 0;
io.Reserved6 = 1;
io.Reserved7 = 0;
ZwSystemDebugControl
(
SysDbgSysReadIoSpace,
&io,
sizeof (io),
NULL,
0,
NULL
);
return Value;
}
WORD InPortW (int Port)
{
WORD Value;
IO_STRUCT io;
io.IoAddr = Port;
io.Reserved1 = 0;
io.pBuffer = (PVOID) (PULONG) & Value;
io.NumBYTEs = sizeof (WORD);
io.Reserved4 = 1;
io.Reserved5 = 0;
io.Reserved6 = 1;
io.Reserved7 = 0;
ZwSystemDebugControl
(
SysDbgSysReadIoSpace,
&io,
sizeof (io),
NULL,
0,
NULL
);
return Value;
}
void OutPortB (int Port, BYTE Value)
{
IO_STRUCT io;
io.IoAddr = Port;
io.Reserved1 = 0;
io.pBuffer = (PVOID) (PULONG) & Value;
io.NumBYTEs = sizeof (BYTE);
io.Reserved4 = 1;
io.Reserved5 = 0;
io.Reserved6 = 1;
io.Reserved7 = 0;
ZwSystemDebugControl
(
SysDbgSysWriteIoSpace,
&io,
sizeof (io),
NULL,
0,
NULL
);
}
void OutPortW (int Port, WORD Value)
{
IO_STRUCT io;
io.IoAddr = Port;
io.Reserved1 = 0;
io.pBuffer = (PVOID) (PULONG) & Value;
io.NumBYTEs = sizeof (WORD);
io.Reserved4 = 1;
io.Reserved5 = 0;
io.Reserved6 = 1;
io.Reserved7 = 0;
ZwSystemDebugControl
(
SysDbgSysWriteIoSpace,
&io,
sizeof (io),
NULL,
0,
NULL
);
}
void ChangeByteOrder(unsigned char * szString, unsigned short uscStrSize)
{
unsigned short i;
CHAR temp;
for (i = 0; i < uscStrSize; i+=2)
{
temp = szString[i];
szString[i] = szString[i+1];
szString[i+1] = temp;
}
}
void PrintIdeInfo (WORD diskdata [256])
{
unsigned char s[41];
memcpy(s,(char *)&diskdata[27],40);
ChangeByteOrder(s,40);
s[40]=0;
cout<<endl<<"Module Number: "<<s<<endl;
memcpy(s,(char *)&diskdata[23],8);
ChangeByteOrder(s,8);
s[8]=0;
cout<<"Firmware rev : "<<s<<endl;
memcpy(s,(char *)&diskdata[10],20);
ChangeByteOrder(s,20);
s[20]=0;
cout<<"Serial Number: "<<s<<endl;
unsigned long pp=diskdata[60];//s[0];
unsigned long pp1=diskdata[61]<<16;
pp=pp|pp1;
cout<<"最大容量 : "<<pp/2/1000<<"M"<<endl<<endl;
printf("安全 :%04X \n",diskdata[128]);
printf("ATAI版本 :%04X \n\n\n",diskdata[80]);
printf("指令组支持82 :%04X \n",diskdata[82]);
if((diskdata[82]&0x0002)==0x0002)
printf("指令支持 : 支持安全模态功能组指令\n");
else
printf("指令支持 : 不支持安全模态功能组指令\n");
if((diskdata[82]&0x0400)==0x0400)
printf("指令支持 : 支援保护主机被设定的区域的功能\n\n");
else
printf("指令支持 : 不支援保护主机被设定的区域的功能\n\n");
printf("指令组支持83 :%04X\n",diskdata[83]);//固定的指令/ 功能能够。
if((diskdata[83]&0x0100)==0x0100)
printf("指令支持 : 支援扩充的安全设定最大指令\n\n");
else
printf("指令支持 : 不支援扩充的安全设定最大指令\n\n");
printf("固定指令/ 功能激活85 :%04X\n",diskdata[85]);
if((diskdata[86]&0x0002)==0x0002)
printf("指令支持 : 设定的安全模态功能激活\n\n");
else
printf("指令支持 : 设定的安全模态功能没有激活\n\n");
printf("固定指令/ 功能激活86 :%04X\n",diskdata[86]);
if((diskdata[86]&0x0100)==0x0100)
printf("指令支持 : SET MAX SET PASSWORD激活\n\n");
else
printf("指令支持 : SET MAX SET PASSWORD没有激活\n\n");
printf("管理员口令 校订码92 :%04X\n",diskdata[92]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -