win 7ディスク読み書き操作
2925 ワード
Layout:post title:win 7ディスク読み書き操作categories:C/C++description:win 7ディスク読み書き操作keywords:url:https://lichao890427.github.io/https://github.com/lichao890427/
ダイレクトコード
通常、Win 7システムの16セクタ以降の書き込みは無効であり、これを解読するには通常駆動レベルで実装されるが、ここではアプリケーション層実装方法を提供する.
注意事項
readとwriteの場合は一般的に512の倍数であり、読み書きの大きさはシステムの最大粒度を超えてはならず、通常64 Mであり、MSDNではこれを提示していない.
ダイレクトコード
通常、Win 7システムの16セクタ以降の書き込みは無効であり、これを解読するには通常駆動レベルで実装されるが、ここではアプリケーション層実装方法を提供する.
HANDLE handle=CreateFile("\\\\.\\c:",GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
//GENERIC_ALL , , GENERIC_ALL INVALID_HANDLE GENERIC_READ|GENERIC_WRITE
BOOL ret;
ret=SetFilePointer(handle,0x0000CC00,NULL,FILE_BEGIN);
BYTE buffer[512];
memset(buffer,1,512);
DWORD num;
ret=DeviceIoControl(handle,FSCTL_DISMOUNT_VOLUME,NULL,0,NULL,0,&num,NULL);// FSCTL_LOCK_VOLUME
// , ,
ret=WriteFile(handle,buffer,512,&num,NULL);// ,
CloseHandle(handle);
Administrator Administrators CreateFile , , unlocker
```C++
bool SetACL(LPWSTR OjbectName)
{
PSID pEveryoneSID=NULL,pAdminSID=NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthWorld=SECURITY_WORLD_SID_AUTHORITY;
if(!AllocateAndInitializeSid(&SIDAuthWorld,1,SECURITY_WORLD_RID,0,0,0,0,0,0,0,&pEveryoneSID))
{//ERROR
if(pEveryoneSID) FreeSid(pEveryoneSID);
return FALSE;
}
SID_IDENTIFIER_AUTHORITY SIDAuthNT=SECURITY_NT_AUTHORITY;
if(!AllocateAndInitializeSid(&SIDAuthNT,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,
0,0,0,0,0,0,&pAdminSID))
{
if(pAdminSID) FreeSid(pAdminSID);
if(pEveryoneSID) FreeSid(pEveryoneSID);
return FALSE;
}
EXPLICIT_ACCESS ea[2];
ZeroMemory(ea,2*sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions=GENERIC_ALL;
ea[0].grfAccessMode=SET_ACCESS;
ea[0].grfInheritance=NO_INHERITANCE;
ea[0].Trustee.TrusteeForm=TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType=TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName=(LPSTR)pEveryoneSID;
ea[1].grfAccessPermissions=GENERIC_ALL;
ea[1].grfAccessMode=SET_ACCESS;
ea[1].grfInheritance=NO_INHERITANCE;
ea[1].Trustee.TrusteeForm=TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType=TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName=(LPSTR)pAdminSID;
PACL pACL=NULL;
if(!SetEntriesInAcl(2,ea,NULL,&pACL))
{
DWORD nRet=SetNamedSecurityInfoW(OjbectName,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pACL,NULL);
if(nRet == ERROR_ACCESS_DENIED)
{
SetNamedSecurityInfoW(OjbectName,SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,pAdminSID,NULL,NULL,NULL);
SetNamedSecurityInfoW(OjbectName,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pACL,NULL);
}
}
if(pACL) LocalFree(pACL);
if(pAdminSID) FreeSid(pAdminSID);
if(pEveryoneSID) FreeSid(pEveryoneSID);
return 0;
}
注意事項
readとwriteの場合は一般的に512の倍数であり、読み書きの大きさはシステムの最大粒度を超えてはならず、通常64 Mであり、MSDNではこれを提示していない.