2016年4月23日土曜日

【PSO2】NtfsDisableLastAccessUpdateが無効化されるので投げやりな対策【nPro】

<そもそもこれでいい気がする>
Win+r→regedit→HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdateを選択
→編集→アクセス許可→詳細設定→Users→値の設定のチェックボックス"拒否"をON→nProが書き換えられなくなって終了
なおユーザーもregeditから値を設定できなくなる模様





<自動化はよ>
リターナーIIでやらかしたぷそに。なお私はそれどころではなくSHAD凍土-浮遊-海岸を周回していたので買わなかった模様。

どっちにしろリタII2sからリタV5s以上作る金額考えたらねぇ…どっちにしろあんなもんはいひとの道楽よ。
ちなみにIV→Vは20%…報酬期間に+40%投げ込んでも7割の勝負である


とか言ってたらぷそに起動時にレジストリが書き換えられるとかいう話題が。

なんでもNtfsDisableLastAccessUpdateが0(無効化)されるとかなんとか。Ntfs(ryってなんじゃい。

NTFSの最終アクセス日時の更新を無効にする - LostTechnology

ファイルに対してのアクセス回数増えるからSSD寿命に関係してくる内容だね。道理でHDDバーストワンモアとか言われる訳だ。

ここでSSDを殺すには1日10GB書き込んで100年位かかる量が必要だとかそういう事は黙っておこう。空気を読まないとムラハチにされちゃうからね。
プロセス微細化の度に寿命がゴッソリ減ってくので今後はどうなるかわかんないけどね!

ぶっちゃけこんな設定が効いてくるのはJMF601~JMF612時代の話な気がする。精神衛生の問題?



という訳で確認してみたところ無効になってました。実際にアクセス日時が更新されるのも確認。

前回再起動したのがEP4が来る前なので結構前から無効になってた模様。再起動しないと有効にならないからね。

サクっと有効にしてみたがぷそに起動すると無効に戻る。起動時…あっ(察し)

とりあえずレジストリ監視して無効になったら有効にすりゃいいじゃん!と考えてみる。

…system関数の標準出力ってどうやって引っ張ってくるの?(無知)

残念!中の人はプログラムなんて書けないのであった!C言語とか完璧に忘れてました!()


という訳でNtfs(ryを有効にするバッチファイルを用意しました。起動したらポチっと動かしてください…

@echo off
set ValueName=NtfsDisableLastAccessUpdate
for /f "tokens=1,2*" %%i in (
'reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v "%ValueName%"'
) DO (
if "%%i"=="%ValueName%" ( set Value=%%k
)
)
if "%Value:~2,3%"=="0" (
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v "%ValueName%" /t REG_DWORD /d 1 /f > nul
echo NtfsDisableLastAccessUpdateが無効なので有効にしました
) else echo NtfsDisableLastAccessUpdateは有効でした


再起動しなけりゃ有効/無効が切り替わらないんだから無効になっても再起動前に有効にすりゃ変わらないだろという安直な考えである。

ちなみにレジストリの値取得部分は↓から全力でコピペさせていただきました(感謝)

レジストリの値を取得して変数にセットする方法 - downy bird

とりあえず私は無心でエンシェントクォーツを掘る作業に戻りm(イースターでゲイルがドロップした音)





<もう少しマシな実装はできねぇのか>
あれから無い知恵絞って自動化してみたよ。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(void)
{
HWND KTITL,NTITL=NULL;
DWORD i=0;
HANDLE h;
FILE *fp;
int j;
char a[256],b[24];
SetConsoleTitle("NtfsDisableLastAccessUpdate-Enabler");
Sleep(100);
KTITL=FindWindow(NULL,"NtfsDisableLastAccessUpdate-Enabler");
ShowWindow(KTITL,i);
l1:Sleep(10000);
NTITL=FindWindow(NULL,"Phantasy Star Online 2");
if(NTITL!=NULL)
{
srand(time(NULL));
sprintf(b,"%d%d.bat",rand(),rand());
fp=fopen(b,"w");
fprintf(fp,"@echo off\n");
fprintf(fp,"set ValueName=NtfsDisableLastAccessUpdate\n");
fprintf(fp,"for /f \"tokens=1,2*\" %%%%i in ( \'reg query \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\FileSystem\" /v \"%%ValueName%%\"\' ) DO ( if \"%%%%i\"==\"%%ValueName%%\" ( set Value=%%%%k ))\n");
fprintf(fp,"exit /b %%Value:~2,3%%");
fclose(fp);
_fullpath(a,b,128);
l2:Sleep(10000);
j=system(a);
if(j==0)
{
system("reg add \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\FileSystem\" /v \"NtfsDisableLastAccessUpdate\" /t REG_DWORD /d 1 /f > nul");
remove(a);
l3:Sleep(10000);
if(FindWindow(NULL,"Phantasy Star Online 2")!=NULL)
{
goto l3;
}
if(FindWindow(NULL,"Phantasy Star Online 2")==NULL)
{
goto l1;
}
}
goto l2;
}
goto l1;
return 0;
}

なんだこのクソみたいな実装は!?(驚愕)

レジストリの値を読み出すのにバッチファイルの戻り値を使うという。しかもわざわざ作る。ひどい。

しかもきょーびお目にかかれないGOTOなんぞ使っております。for使ってもfor(;;)-if-breakで書いちゃうからね仕方ないね。

一応起動すると常駐してぷそにを監視、ぷそにが起動してレジストリが書き換えられると修正して監視に戻る(はず)。自分で試してはいるけどね。

なお起動するとウィンドウすら出ないので落とす時はtaskkillかタスクマネージャでどうぞ。

え?実行ファイル?バイナリ?しょうがないにゃあ…

お約束として使用した事による損害等に関しまして一切責任取りません故あしからず。

というか一番上に書いてある方法のが楽なんじゃない?(ぉ