mfc 裸寫sd卡扇區
#include "stdafx.h"
#include <windows.h>
#include "stdafx.h"
#include "types_def.h"
#include "compat_error.h"
#include "compat_sem.h"
#include <windows.h>
#include <stdio.h>
extern void HexDump(char *buf, int len, int addr);
#define READ 0
#define WRITE 1
//通過給定磁碟的編號,獲取到磁碟的控制代碼
HANDLE GetDiskHandle( int iDiskNo, int op_mode )
{
char szDriverBuffer[128];
memset( szDriverBuffer, 0, 128 );
//格式化裝置檔名稱
sprintf_s( szDriverBuffer, "\\\\.\\PhysicalDrive%d", iDiskNo );
HANDLE m_hDevice = NULL;
//CreateFile獲取到裝置控制代碼
if( op_mode == READ ){
m_hDevice = CreateFileA( szDriverBuffer, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, NULL, NULL );
}else if( op_mode == WRITE ){
m_hDevice = CreateFileA( szDriverBuffer, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, NULL, NULL );
}
//szDriverBuffer --> 裝置名稱,這裡指第一塊硬碟,多個硬碟的自己修改就好了
//GENERIC_READ--> 指定讀訪問方式
//GENERIC_WRITE --> 指定寫訪問方式
//FILE_SHARE_READ | FILE_SHARE_WRITE --> 共享模式為讀|寫,0表示不能共享
//NULL --> NULL表示該控制代碼不能被子程式繼承
//OPEN_EXISTING --> 開啟已經存在的檔案,檔案不存在則函式呼叫失敗
//NULL --> 指定檔案屬性
//NULL
if( m_hDevice == INVALID_HANDLE_VALUE ){
m_hDevice = NULL;
//無效
return INVALID_HANDLE_VALUE;
}
//裝置控制代碼
return m_hDevice;
}
//通過磁碟的控制代碼,給定讀取的位置,獲取到扇區512位元組資料返回
//readpos:扇區的邏輯地址
//lpOutBuffer512:用於返回讀取的資料
BOOL ReadSectorData( HANDLE& hDevice, UINT64 readpos, __out char *lpOutBuffer512 )
{
LARGE_INTEGER li;
DWORD DCount;
BOOL bResult;
memset( lpOutBuffer512, 0, 512 );
li.QuadPart = readpos*0x200;
//0x200 = 512,求出扇區的位元組地址,通過設定讀取的地址和長度進行read
SetFilePointer( hDevice, li.LowPart, &li.HighPart, FILE_BEGIN );
DCount = 0;
//計數
bResult = ReadFile( hDevice, lpOutBuffer512, 512, &DCount, NULL );
HexDump(&lpOutBuffer512[0], 512, 0);
return bResult;
}
//通過磁碟的控制代碼,給定寫入資料的位置,寫入512位元組資料到指定扇區
//writepos:寫入扇區的邏輯地址
//lpInBuffer512:準備寫入的資料buff
BOOL WriteSectorData( HANDLE& hDevice, UINT64 writepos, __in char *lpInBuffer512 )
{
LARGE_INTEGER li;
DWORD DCount;
BOOL bResult;
li.QuadPart = writepos * 0x200;
//0x200 = 512,求出扇區的位元組地址,通過設定寫入的地址和長度進行write
SetFilePointer( hDevice, li.LowPart, &li.HighPart, FILE_BEGIN );
DCount = 0;
//計數
bResult = WriteFile( hDevice, lpInBuffer512, 512, &DCount, NULL );
return bResult;
}
int mytestudisk_main( void )
{
char *lpInOutBuffer512;
HANDLE m_hDevice = NULL;
TRACE( "in mytestudisk_main\r\n" );
lpInOutBuffer512 = (char *)malloc(512+1);
m_hDevice = GetDiskHandle( 1, READ );
ReadSectorData( m_hDevice, 14, lpInOutBuffer512 );
CloseHandle(m_hDevice);
HexDump( &lpInOutBuffer512[0],512, 0);
m_hDevice = GetDiskHandle( 1, WRITE );
lpInOutBuffer512[0] = 0x5a;
HexDump(&lpInOutBuffer512[0], 512, 0);
WriteSectorData(m_hDevice, 14, &lpInOutBuffer512[0]);
CloseHandle(m_hDevice);
free(lpInOutBuffer512);
lpInOutBuffer512 = NULL;
return 0;
}