西数硬盘调整APM避免停转

跟daddy置换电脑时购买了西数WD10JPVX笔记本硬盘作为移动硬盘,结果该硬盘有个坑爹的设定,就是每当空闲十几秒就直接停转了,再次启动时系统就会卡个两秒钟。可能西数没去考虑将此硬盘作为从盘或移动硬盘使用。

搜索到了“C1门”,试着用wdidle3修改,表示对C1(磁头归位)也许有效,但对停转(04)没有效果。

继续搜索得知这是APM(高级电源管理)的问题,此型号APM默认值为0x60,比较流行的解决方法是安装CrystalDiskInfo,将APM关闭或者设为0x80。但由于硬盘断电后该设置会复位,所以需要将CrystalDiskInfo设为开机启动。

为了一个破硬盘要装个daemon?po主表示不能忍,再说我这是移动硬盘,插别的电脑上怎么办,中国能移动daemon又移不动。

考虑研究一下如何调用APM,然后自己写一个小程序放到移动硬盘上,插上后运行一下。

期间参考了这篇文章,但是编译后发现只能支持本地硬盘,无法识别移动硬盘。谷歌未果,只好OD挂一下CrystalDiskInfo,发现其对本地硬盘和移动硬盘调整APM时DeviceIoControl的ioctl id不一样,搜索此id得知USB移动硬盘是SCSI接口。继续搜索得到关于SCSI ATA PASSTHROUGH调用的白皮书,经多次试验成功实现修改APM。

代码如下:

#include <Windows.h>
#include <ntddscsi.h>
#include <stdio.h>

void main()
{
	char name[260] = "\\\\.\\";
	GetModuleFileNameA(NULL, &name[4], 256);
	name[6] = 0;
	HANDLE handle = CreateFileA(name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
	STORAGE_DEVICE_NUMBER sdn;
	DWORD nRet = 0;
	BOOL ret = DeviceIoControl(handle, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdn, sizeof(sdn), &nRet, NULL);
	sprintf(&name[4], "PhysicalDrive%d", sdn.DeviceNumber);
	CloseHandle(handle);
	handle = CreateFileA(name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
	ATA_PASS_THROUGH_EX aptex = {0};
	aptex.Length = sizeof(ATA_PASS_THROUGH_EX);
	aptex.TimeOutValue = 2;
	aptex.CurrentTaskFile[6] = 0xEF;
	aptex.CurrentTaskFile[0] = 0x05;
	aptex.CurrentTaskFile[1] = 0x80;
	ret = DeviceIoControl(handle, IOCTL_ATA_PASS_THROUGH, &aptex, sizeof(ATA_PASS_THROUGH_EX), NULL, 0, &nRet, NULL);
	SCSI_PASS_THROUGH spt = {0};
	spt.Length = sizeof(SCSI_PASS_THROUGH);
	spt.TimeOutValue = 2;
	spt.CdbLength = 12;
	spt.Cdb[0] = 0xA1;
	spt.Cdb[1] = 3 << 1;
	memcpy(&spt.Cdb[3], aptex.CurrentTaskFile, 8);
	ret = DeviceIoControl(handle, IOCTL_SCSI_PASS_THROUGH, &spt, sizeof(SCSI_PASS_THROUGH), NULL, 0, &nRet, NULL);
	CloseHandle(handle);
}

程序会根据自己所在的盘符打开PhysicalDrive,并尝试SATA与SCSI两种方式修改APM值为0x80。

对于不想编译的同学,也可直接点此下载,解压密码为本站域名。不要修改文件名,windows会将文件名带有Setup的程序以UAC管理员权限启动。

9 Replies to “西数硬盘调整APM避免停转”

  1. 博主,我同样遇到这个问题,最后找到一个永久的解决方案。希望提供给大家参考。
    APMtimer
    http://apmtimer.sourceforge.net/
    这个工具可以修改APM的计时器时间或者关闭计时器。
    1。是APM修改,不是Idle3修改,后者对于APM设置是60h的情况是无效的。
    2。 由于是直接修改固件,因此是永久有效的。
    3。 可以直接修改移动硬盘
    4。是一个linux下的程序

    1. 5。成功修改两个硬盘,另一个较新的SMR盘无法识别命令(此盘没有C1问题)。

  2. 大佬,域名解压密码不对,很想解决我西数硬盘的问题,求解决。。

  3. 博主你的硬盘盒是什么型号什么芯片,我的是蓝硕u23t,jms578芯片,硬盘和你一样,crystalinfo根本就设置无效,当然你的小程序也就不起作用。不知道换一个usb2.0硬盘盒能不能用apmtimer永久设置好。

    1. 我是1153芯片。我这个硬盘买了蛮久了,可能和你的固件版本不一样了吧

Leave a Reply to 逍遥 Cancel reply

Your email address will not be published. Required fields are marked *