[TC++] 在 DOS 下 read/write 4G memory sample code

DOS 下使用 Flat mode 讀寫 4G memory 的 sample code。

所謂 flat mode 就是在主程式執行在 Real Mode 下,可是卻能讀寫 4G memory space的特殊模式,要進入 flat mode 也很簡單,首先先取得 gdt_table 的線性位址 (linear address),將 linear address 填入 gdtr offset 欄位,使用 lgdt 指令載入 gdt table,再來將 cr0 register bit0 設為1進入 protect mode,然後 selector (fs, fs, es, ss…) 選擇 gdt table 中的 data group,再清掉 cr0 register bit0 返回 real mode,以後要讀寫 4G memory space 時就直接使用 fs:[address] 來讀寫即可。

繼續閱讀 “[TC++] 在 DOS 下 read/write 4G memory sample code”

[Ubuntu] Debug card (80 port) driver sample code

要編譯要先安裝 build-essential 與 libelf-dev 套件, build-essential 包含了編譯 C / C++ 所需的套件,lebelf-dev 則包含編譯 driver (kernel module) 所需的程式。

$ sudo apt-get update
$ sudo apt-get install build-essential
$ sudo apt-get install libelf-dev
// debug_card.h
#ifndef _DEBUG_CARD_H_
#define MSG(format, arg...) printk(KERN_INFO "DEBUG CARD: " format "\n", ## arg)
#include <linux/ioctl.h>
#define DEV_MAJOR 121
#define DEV_NAME "debug"
#define DEV_IOCTLID 0xD0
#define IOCTL_WRITE _IOW(DEV_IOCTLID, 10, int)
#define IOCTL_RESET _IOW(DEV_IOCTLID, 0, int)
#endif

繼續閱讀 “[Ubuntu] Debug card (80 port) driver sample code”

[VC] UAC + requireAdministrator + 開機自動執行

在 UAC 開啟的情況下,要開機自動執行需管理管權限的(requireAdministrator) 的程式,必需使用 Windows 的排程設定(schtasks)來啟動程式,才不會在開機時出現 UAC 要求權限的視窗。

範例:

 
void RegAutoRun(bool cmd)
{
  if (cmd == 1)
  {
    //加入啟動排程
    CString str;
    str.Format(L"/Create /F /TN \"AppName\" /SC ONLOGON /RL HIGHEST /TR \"\\\"%s\\App.EXE\\\"\"", GetLaunchDir());
    ShellExecute(NULL, _T("open"), _T("schtasks.exe"), str, _T(""), 0);
  }
 else
 {
  //從排程中移除
  ShellExecute(NULL, _T("open"), _T("schtasks.exe"), _T("/Delete /F /TN \"AppName\""), _T(""), 0);
  }
}

[C++] 函式指標

typedef 傳回值 (*函式指標名稱) (傳遞參數) ;

typedef int (*PFUN) (int x, int y);

int ADD(int x, int y) {
    return x+y;
}

int SUB(int x, int y) {
    return x-y;
}

main()
{
    int n;
    PFUN pf = NULL;

    pf = ADD;
    n = pf(10,5);  //n=15

    pf = SUB;
    n = pf(10, 5); //n=5
}

[VC] 結構的對齊 struct member alignment

compiler為了程式的執行效率,大都會對程式進行最佳化的動作,在結構中則會進行資料對齊以加快執行速度,作業系統、Compiler、CPU都影響資料對齊的邊界 (boundary alignment)。

Wiki – Data structure alignment 說明

來看看這個例子:

 
struct
{
 char c1;  //1 bytes
 char c2;  //1 bytes
 int  i1;  //4 bytes
 char c3;  //1 bytes
}S;

繼續閱讀 “[VC] 結構的對齊 struct member alignment”