📄 blockdevice.c
字号:
#include "Blockdevice.h"
#include "codes.h"
#include "windows.h"
#include "stdio.h"
#define SET_BYTE(_data_, _val_, _off_) \ (*( ((cyg_uint8 *)_data_) + (_off_) ) = _val_)#define SET_WORD(_data_, _val_, _off_) \ do { \ *( ((cyg_uint8 *)_data_) + (_off_) ) = _val_ & 0xFF; \ *( ((cyg_uint8 *)_data_) + (_off_) + 1 ) = (_val_ >> 8) & 0xFF; \ } while (0)#define SET_DWORD(_data_, _val_, _off_) \ do { \ *( ((cyg_uint8 *)_data_) + (_off_) ) = _val_ & 0xFF; \ *( ((cyg_uint8 *)_data_) + (_off_) + 1 ) = (_val_ >> 8) & 0xFF; \ *( ((cyg_uint8 *)_data_) + (_off_) + 2 ) = (_val_ >> 16) & 0xFF; \ *( ((cyg_uint8 *)_data_) + (_off_) + 3 ) = (_val_ >> 24) & 0xFF; \ } while (0)#define SET_BYTES(_data_, _var_, _size_, _off_) \ memcpy((void *)(((cyg_uint8 *)_data_)+(_off_)), (void *)(_var_), _size_)
BYTE *FlashBuf;
LPVOID pVoid;
HANDLE hFilemap;
HANDLE hFile;
int ReadBlock(void *buf, cyg_uint32 *len, cyg_uint32 bnum, cyg_uint32 pos)
{
if((pos + *len) >= 8*1024*1024)
printf("Occor a error when reading block from the device\n");
memcpy(buf,(FlashBuf+pos),*len);
return ENOERR;
}
int WriteBlock(void *buf,cyg_uint32 *len, cyg_uint32 bnum, cyg_uint32 pos)
{
if((pos + *len) >= 8*1024*1024)
printf("Occor a error when writing block to the device\n");
memcpy((FlashBuf+pos),buf,*len);
return ENOERR;
}
int FormatDisk(void)
{
unsigned char data[512];
unsigned int len = 512;
int err;
memset(FlashBuf,0xff,512*(1+64+64+32));
memset(data,0,512);
SET_WORD(data, 0xEB, 0x00);
SET_BYTES(data, "ciitec", 8, 0x03);
SET_WORD(data, 512, 0x0B);
SET_BYTE(data, 1, 0x0D); SET_WORD(data, 1, 0x0E); SET_BYTE(data, 2, 0x10); SET_WORD(data, 512, 0x11); SET_WORD(data, 16384, 0x13); SET_BYTE(data, 0xF8, 0x15); SET_WORD(data, 64, 0x16); SET_WORD(data, 1, 0x18); SET_WORD(data, 1, 0x1A); SET_DWORD(data, 0, 0x1C); SET_DWORD(data, 0, 0x20); SET_WORD(data, 0, 0x24); SET_BYTE(data, 0x29, 0x26); SET_DWORD(data, 0, 0x27); SET_BYTES(data, "Conan", 11, 0x2B); SET_BYTES(data, "Conan", 8, 0x36); SET_WORD(data, 0x55AA, 0x1FE); err = WriteBlock((void*)data, &len, 0, 0); if(err != ENOERR)
{
printf("Write boot record occur a error!\n");
return 1;
}
return ENOERR;
}
int InitialDevice(void)
{
char path[] = "c:\\flash.dev";
hFile=CreateFile( path,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
//没有这个文件,就建立一个新的
if(hFile == INVALID_HANDLE_VALUE)
{
hFile=CreateFile( path,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
printf("this file have existed\n");
return 0;
}
hFilemap = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
8*1024*1024, // 开辟FLASHSIZE
NULL);
if(hFilemap == NULL)
{
CloseHandle(hFile);
return 0;
}
pVoid=MapViewOfFile(hFilemap,FILE_MAP_ALL_ACCESS,0,0,0);
if(pVoid == NULL)
{
CloseHandle(hFile);
CloseHandle(hFilemap);
return 0;
}
FlashBuf=(unsigned char *)pVoid;
memset(FlashBuf,0xff,8*1024*1024);
//进行释放工作
CloseHandle(hFile);
CloseHandle(hFilemap);
UnmapViewOfFile(pVoid);
//重新打开
hFile=CreateFile( path,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return 0;
}
}
hFilemap = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
8*1024*1024, // 开辟FLASHSIZE
NULL);
if(hFilemap == NULL)
{
CloseHandle(hFile);
return 0;
}
pVoid=MapViewOfFile(hFilemap,FILE_MAP_ALL_ACCESS,0,0,0);
if(pVoid == NULL)
{
CloseHandle(hFile);
CloseHandle(hFilemap);
return 0;
}
FlashBuf=(unsigned char *)pVoid;
return 1;
}
void EndDevice(void)
{
//进行释放工作
CloseHandle(hFile);
CloseHandle(hFilemap);
UnmapViewOfFile(pVoid);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -