2017/06/26

Linux- 關於timer定時器, delay延遲, sleep睡眠, 與中斷....等等

定時器(timer)

(參考)定時器(不懂的話,可以暫時想成個鬧鐘)分為硬件和軟件定時器,軟件定時器最終還是要依靠硬件定時器來完成。
內核在時鐘中斷發生後檢測各定時器是否到期,到期後的定時器處理函數將作為軟中斷在底半部執行。
實質上,時鐘中斷處理程序執行update_process_timers函數,該函數調用run_local_timers函數,這個函數處理TIMER_SOFTIRQ軟中斷,運行當前處理上到期的所有定時器。

Linux內核中定義提供了一些用於操作定時器的數據結構和函數如下:
1)timer_list:說定時器,當然要來個定時器的結構體

struct timer_list{    struct list_head entry; //定時器列表    unsigned long expires; //定時器到期時間    void (*function)(unsigned long) ;//定時器處理函數    unsigned long data; //作為參數被傳入定時器處理函數    struct timer_base_s *base;}

2)初始化定時器:
經過這個初始化後,entry的next為NULL,並給base賦值

void init_timer(struct timer_list *timer);

3)增加定時器:
該函數用於註冊內核定時器,並將定時器加入到內核動態定時器鍊錶中。

void add_timer(struct timer_list *timer);

4)刪除定時器:

int del_timer(struct timer_list *timer);

說明:del_timer_sync是del_timer的同步版,主要在多處理器系統中使用,如果編譯內核時不支持SMP,del_timer_sync和del_timer等價.

5)修改定時器:

int mod_timer(struct timer_list *timer, unsigned long expires);

ex: 下邊是一個使用定​​時器的模版:

struct xxx_dev /*second設備結構體*/{  struct cdev cdev; /*cdev結構體*/  ...  struct timer_list xxx_timer; /*設備要使用的定時器*/};int xxx_func1(...) //xxx驅動中某函數{  struct xxx_dev *dev = filp->private_data;    ...  /*初始化定時器*/  init_timer(&dev->xxx_timer);  dev->xxx_timer.function = &xxx_do_handle;  dev->xxx_timer.data = (unsigned long)dev;  dev->xxx_timer.expires = jiffies + delay;    add_timer(&dev->xxx_timer); /*添加(註冊)定時器*/  ...  return 0;}int xxx_func2(...) //驅動中某函數{  ...  del_timer(&second_devp->s_timer);  ...}static void xxx_do_timer(unsigned long arg) //定時器處理函數{  struct xxx_device *dev = (struct xxx_device *)(arg);    ...    //調度定時器再執行  dev->xxx_timer.expires = jiffies + delay;  add_timer(&dev->xxx_timer);}在定時器函數中往往會在做完具體工作後,延遲expires並將定時器再次添加到內核定時器鍊錶中,以便定時器能被再次觸發 

關於延遲與睡眠

在內核定時器中,常常少不了要說下內核延遲的事,請接著往下看:
1)短延遲:
在linux內核中提供了三個函數來分別實現納秒,微秒,毫秒延遲,原理上是忙等待,它根據CPU頻率進行一定次數的循環

void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsigned long msecs);

毫秒延遲已經相當大了,當然更秒延遲當然要小一些,在內核中,為了性能,最好不要用mdelay,這會耗費大量cpu資源

void msleep(unsigned int millisecs); unsigned long msleep_interruptible(unsigned int millisecs); void ssleep(unsigned int seconds);

這三個是內核專門提供該我們用來處理毫秒以上的延遲。
上述函數將使得調用它的進程睡眠參數指定的秒數,其中第二個是可以被打斷的,其餘的兩個是不可以的。

2)長延遲:
內核中進行延遲最常用的方法就是比較當前的jiffies和目標jiffies(當前的加上時間間隔的jiffies),直到未來的jiffies達到目標jiffies。
比如:

unsigned long delay = jiffies + 100; //延遲100個jiffieswhile(time_before(jiffies, delay));

與time_before對應的還有一個time_after().
其實就是#define time_before(a,b) time_after(b,a);

另外兩個是time_after_eq(a,b)和time_before_eq(a,b)

3)睡著延遲:
這顯然是比忙等待好的方法,因為在未到來之前,進程會處於睡眠狀態,
把CPU空出來,讓CPU可以做別的事情,等時間到了,調用schedule_timeout()就可以喚醒它並重新調度執行。
msleep和msleep_interruptible本質上都是依靠包含了schedule_timeout的schedule_timeout_uninterruptible()和schedule_timeout_interruptible()實現。
就像下邊這樣:

void msleep(unsigned int msecs){    unsigned long timeout = msecs_to_jiffies(msecs) + 1;    while(timeout)         timeout = schedule_timeout_uninterruptible(timeout);}unsigned long msleep_interruptible(unsigned int msecs){    unsigned long timeout = msecs_to_jiffies(msecs) + 1;    while(timeout && !signal_pending(current))         timeout = schedule_timeout_interruptible(timeout);    return jiffies_to_msecs(timeout);}signed long __sched schedule_timeout_interruptible()signed long timeout){    __set_current_state(TASK_INTERRUPTIBLE);    return schedule_timeout(timeout);}signed long __sched schedule_timeout_uninterruptible()signed long timeout){    __set_current_state(TASK_UNINTERRUPTIBLE);    return schedule_timeout(timeout);}

另外還有如下:

time_on_timeout(wait_queue_head_t *q, unsigned long timeout);interruptible_sleep_on_timeout(wait_queue_head_t *q, unsigned long timeout);

這兩個將當前進程添加到等待隊列,從而在等待隊列上睡眠,當超時發生時,進程將被喚醒。


關於udelay & mdelay, 就是busy waiting方式

driver常常會需要很短且精準的delay(n microsecond/millisecond),以完成sync。
此時用jiffies就不恰當,第一單位不夠小,如果timer是100Hz,表示一個tick是10 millisecond。
第二不夠準,因為透過scheduler。在kernel裡有兩個function來完成很小的delay,不使用jiffies:

在<linux/delay.h>

void udelay(unsigned long usecs)void mdelay(unsigned long msecs)

以上兩個都是busy waiting。
udelay的實作要先談BogoMIPS,這個值是指在特定時間內CPU可執行多少個busy loop operation。
也就是說,這個CPU不做任何事可以多快(久) (how fast a processor can do nothing)。
這個值在kernel裡是一個叫做loops_per_jiffy的變數,
在userspace則可在/proc/cpuinfo裡找到。

而kernel是在init/main.c裡透過calibrate_delay()這個function來計算。
值得一提的是這個值是跟performance沒太大關係的。
這個BogoMIPS主要就是用來實作udelay。
udelay去算需要多少個loop operation來得到精確的delay。

使用udelay要小心overflow,它適合很短的delay,通常不超過1 millisecond。
長一點的delay就用mdelay。
要注意的是udelay和mdelay會影響performance,因為CPU無法做任何其他事,所以通常是用來delay以microsecond為單位比較適合。

關於schedule_timeout(), 就是會進入sleep state

另一種delay是schedule_timeout()。與上述不同的是這方法會進入sleep state,直到指定的時間結束,而不是busy waiting。
另一個是不那麼精確,因為睡完是進入run queue。
使用方式是:

/* set task's state to interruptible sleep */set_current_state(TASK_INTERRUPTIBLE);/* take a nap and wake up in "s" seconds */schedule_timeout(s * HZ);

可看出這是使用jiffies。上面的code是將這個process在interruptible的情況下睡s秒。
state必須要在TASK_INTERRUPTIBLE或是TASK_UNINTERRUPTIBLE執行schedule_timeout才會進入sleep。

其他範例如下:

首先看到怎麼透過sleep 作延遲
其中第一個判斷式 in_interrupt() 定義為
>> #define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK | NMI_MASK)) // 判斷當前是否在硬件、軟件、底半部中斷上下文 (下方補充1)

msleep_interruptible() 延遲的單位為毫秒(10^-3)
且在於等待過程可能被中斷,中斷指的是 process 可以接收 signal (下方補充2)

  xxx_sleep() - sleep  The function suspends the execution of the current thread  until the specified time out interval elapses.       msInterval - the number of milliseconds to suspend the current thread.  A value of 0 may or may not cause the current thread to yield.  void xxx_sleep( v_U32_t msInterval ){   if (in_interrupt())   {      PRINT_TRACE(XXX_MODULE_ID_XXX, XXX_TRACE_LEVEL_ERROR, "%s cannot be called from interrupt context!!!", __func__);      return;   }   msleep_interruptible(msInterval);}

接著看這個小API
它實作與msleep()很像, 只是差別在使用 usecs_to_jiffies()
而msleep()是使用 msecs_to_jiffies()

  xx_sleep_us() - sleep  The function suspends the execution of the current thread  until the specified time out interval elapses.       usInterval - the number of microseconds to suspend the current thread.  A value of 0 may or may not cause the current thread to yield.     --------------------------------------------------------------------------*/void xxx_sleep_us( v_U32_t usInterval ){   unsigned long timeout = usecs_to_jiffies(usInterval) + 1;   if (in_interrupt())   {      PRINT_TRACE(XXX_MODULE_ID_XXX, XXX_TRACE_LEVEL_ERROR, "%s cannot be called from interrupt context!!!", __func__);      return;   }   while (timeout && !signal_pending(current))       timeout = schedule_timeout_interruptible(timeout);}

最後一個例子,
則是透過udelay()實作busy wait

  xxx_busy_wait() - busy wait  The function places the current thread in busy wait until the specified time out interval elapses.   If the interval is greater than 50us on WM, the behaviour is undefined.       para: usInterval - the number of microseconds to busy wait.  void xxx_busy_wait( v_U32_t usInterval ){    udelay(usInterval);}

Reference

Delaying Execution
補充1: in_irq() in_softirq() in_interrupt() 函數區別

#define hardirq_count() (preempt_count() & HARDIRQ_MASK)#define softirq_count() (preempt_count() & SOFTIRQ_MASK)#define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK | NMI_MASK))/** Are we doing bottom half or hardware interrupt processing?* Are we in a softirq context? Interrupt context?*/#define in_irq() (hardirq_count()) //判断当前是否在硬件中断上下文#define in_softirq() (softirq_count()) //判断当前是否在软件中断上下文#define in_interrupt() (irq_count()) //判断当前是否在硬件、软件、底半部中断上下文

補充2: 不忙碌的等待
如果在等待過程中,希望 CPU 去做其它事的話,可以用定義在「linux/delay.h」中 sleep 系列的等待函式:

void ssleep(unsigned int seconds);void msleep(unsigned int msecs);unsigned long msleep_interruptible(unsigned int msecs);

延遲的單位分別為秒、毫秒(10^-3)、毫秒(10^-3)。
msleep_interruptible() 與 msleep() 不同的地方在於等待過程可能被中斷,中斷指的是 process 可以接收 signal。
如果在 msleep_interruptible() 中收到 signal 而中斷等待的話,則會回傳距離原始時限的時間(正值),否則的話傳回「0」。

2017/06/20

ubuntu裡如何設定vnc遠端遙控軟體, 讓windows連上ubuntu

利用vnc連線到ubuntu
底下分享兩個方式

第一個方式就是使用GUI介面的設定

  • 按下系統、偏好設定、遠端桌面
  • 然後勾選:允許其他使用者觀看您的桌面、允許其他使用者控制您的桌面、使用者需要輸入密碼
  • 然後輸入妳想要的密碼
  • 不要打勾:詢問您以確認
  • 這樣就可以了

第二個方式就是利用command line介面

  • 首先先不管ubuntu裡面有沒有裝vnc 都給他下這行指令啦~
    • apt-get install x11vnc
  • 安裝好了以後
    • sudo x11vnc -storepasswd [your_password] /etc/x11vnc.pass
  • 使用
    • x11vnc
      就會開始執行了

 

然後到Windows安裝VNC Viewer 

啟動vnc這樣就可以連進來了

2017/06/13

Wordpress跑馬燈外掛- Vertical marquee post titlem與Post title marquee scroll

這個外掛作者有兩款跑馬燈外掛, 方向不同, 一個垂直方向, 一個水平方向
Vertical marquee post titlem 與 Post title marquee scroll

滿符合我的需求的

他後台有四組設定
也有widget的小工具可直接放於側欄
也有short code放置於文章裡面, 如 short code: [vmpt setting=”2″] (其中數字 1 ~ 4)

官方介紹

https://tw.wordpress.org/plugins/post-title-marquee-scroll/
Post title marquee scroll is a simple wordpress plugin to create the marquee scroll in the website with post title. In the admin we have option to choose the category and display order. We can add this plugin directly in the theme files. Also we have widget and short code option.

https://tw.wordpress.org/plugins/vertical-marquee-post-title/
This plugin will create the vertical marquee effect in your website, if you want your post title to move vertically (scroll upward or downwards) in the screen use this plugin. We are using the simple marquee tag to move the text vertically, and tested this plugin in all the leading internet browsers. admin option available to set the scroll effects and colors scheme.

Features of this plugin

Easy to customize
Easy styles override option
Configurable scroll amount
Option to update scroll delay
Option to update the scroll direction
Option to pause the scroller on mouse over
Option to choose category
Option to select order
Option to enter number of post to scroll

Plugin configuration

Drag and drop the widget : Go to widget menu and drag and drop the Vertical marquee post title widget to your sidebar location.

Short code for pages and posts : Use the below short code in the pages and posts.
[vmpt setting=”1″]
[vmpt setting=”2″]
[vmpt setting=”3″]
[vmpt setting=”4″]

Add directly in the theme : Add the below PHP code in your theme PHP file, for example if you want to add this slider in your website footer, just activate the plugin and add this code in footer.php file.

<?php vmptshow(); ?>

2017/06/08

Woocommerce 客製化有台灣的縣市欄位下拉選單&對應的鄉鎮市下拉選單

使用Wordpress的熱門購物車外掛, 最常被客戶要求修改的部分, 收件資料的縣市鄉鎮要能夠讓消費者自動下拉選擇, 以下是開發修改步驟:

事前準備:

1. 安裝 WooCommerce 購物車主體外掛
2. 安裝 Woo Checkout Field Editor Pro外掛: 可以客製化最後的結帳欄位
3. 安裝 WooCommerce Direct Checkout外掛: 可以讓客戶直接購買, 跳至結帳畫面

步驟1. WooCommerce 官方本來就有開放State的修改:

(官方出處)
安裝這個WooCommerce外掛之後, 便可以將以下的程式碼加入function.php, 縣市列表即可生效
當然要注意把國家代碼選TW, 如下的 $states[‘TW’]

/** * Code goes in functions.php or a custom plugin. Replace XX with the country code your changing. */add_filter( 'woocommerce_states', 'custom_woocommerce_states' );function custom_woocommerce_states( $states ) {	$states['TW'] = array(		        '基隆市' => '基隆市',		        '台北市' => '台北市',		        '新北市' => '新北市',		        '宜蘭縣' => '宜蘭縣',		        '桃園市' => '桃園市',		        '新竹市' => '新竹市',		        '新竹縣' => '新竹縣',		        '苗栗縣' => '苗栗縣',		        '台中市' => '台中市',		        '彰化縣' => '彰化縣',		        '南投縣' => '南投縣',		        '雲林縣' => '雲林縣',		        '嘉義市' => '嘉義市',		        '嘉義縣' => '嘉義縣',		        '台南市' => '台南市',		        '高雄市' => '高雄市',		        '屏東縣' => '屏東縣',		        '花蓮縣' => '花蓮縣',		        '台東縣' => '台東縣',		        '澎湖縣' => '澎湖縣',		        '金門縣' => '金門縣',		        '馬祖縣' => '馬祖縣'			);	return $states;}

下一頁還有步驟2喔!

步驟2. 新增外掛 WC City Select 以擴充:

(外掛介紹)
第一步驟做完之後, 請安裝WC City Select這個外掛, 然後再將以下的程式碼加入function.php, 即可呼應步驟1的縣市列表, 同樣需要留意的是要選的國家代碼也是TW, 如以下的 $cities[‘TW’]

add_filter( 'wc_city_select_cities', 'my_cities' );function my_cities( $cities ) {  $cities['TW'] = array('台北市' => array('中正區','大同區','中山區','松山區','大安區','萬華區','信義區','士林區','北投區','內湖區','南港區','文山區'  	),'基隆市' => array('仁愛區','信義區','中正區','中山區','安樂區','暖暖區','七堵區',  	),'新北市' => array('萬里區','金山區','板橋區','汐止區','深坑區','石碇區','瑞芳區','平溪區','雙溪區','貢寮區','新店區','坪林區','烏來區','永和區','中和區','土城區','三峽區','樹林區','鶯歌區','三重區','新莊區','泰山區','林口區','蘆洲區','五股區','八里區','淡水區','三芝區','石門區'  	),'宜蘭縣' => array('宜蘭市','頭城鎮','礁溪鄉','壯圍鄉','員山鄉','羅東鎮','三星鄉','大同鄉','五結鄉','冬山鄉','蘇澳鎮','南澳鄉'   	),'新竹縣' => array('竹北市','湖口鄉','新豐鄉','新埔鎮','關西鎮','芎林鄉','寶山鄉','竹東鎮','五峰鄉','橫山鄉','尖石鄉','北埔鄉','峨眉鄉'   	),'新竹市' => array('北區','東區','香山區'  	),'桃園市' => array('中壢區','平鎮區','龍潭區','楊梅區','新屋區','觀音區','桃園區','龜山區','八德區','大溪區','復興區','大園區','蘆竹區'   	),'苗栗縣' => array('竹南鎮','頭份市','三灣鄉','南庄鄉','獅潭鄉','後龍鎮','通霄鎮','苑裡鎮','苗栗市','造橋鄉','頭屋鄉','公館鄉','大湖鄉', '泰安鄉','銅鑼鄉','三義鄉','西湖鄉','卓蘭鎮'  	),'台中市' => array('中區','東區','南區','西區','北區','北屯區','西屯區','南屯區','太平區','大里區','霧峰區','烏日區','豐原區','后里區','石岡區','東勢區','和平區','新社區','潭子區','大雅區','神岡區','大肚區','沙鹿區','龍井區','梧棲區','清水區','大甲區','外埔區','大安區'  	),'彰化縣' => array('彰化市','芬園鄉','花壇鄉','秀水鄉','鹿港鎮','福興鄉','線西鄉','和美鎮','伸港鄉','員林市','社頭鄉','永靖鄉','埔心鄉','溪湖鎮','大村鄉','埔鹽鄉','田中鎮','北斗鎮','田尾鄉','埤頭鄉','溪州鄉','竹塘鄉','二林鎮','大城鄉','芳苑鄉','二水鄉'),'南投縣' => array('南投市','中寮鄉','草屯鎮','國姓鄉','埔里鎮','仁愛鄉','名間鄉','集集鎮','水里鄉','魚池鄉','信義鄉','竹山鎮','鹿谷鄉'),'嘉義縣' => array('番路鄉','梅山鄉','竹崎鄉','阿里山	','中埔鄉','大埔鄉','水上鄉','鹿草鄉','太保市','朴子市','東石鄉','六腳鄉','新港鄉','民雄鄉','大林鎮','溪口鄉','義竹鄉','布袋鎮'),'嘉義市' => array('東區','西區'),'雲林縣' => array('斗南鎮','大埤鄉','虎尾鎮','土庫鎮','褒忠鄉','東勢鄉','臺西鄉','崙背鄉','麥寮鄉','斗六市','林內鄉','古坑鄉','莿桐鄉','西螺鎮','二崙鄉','北港鎮','水林鄉','口湖鄉','四湖鄉','元長鄉'),'台南市' => array('中西區','東區','南區','北區','安平區','安南區','永康區','歸仁區','新化區','左鎮區','玉井區','楠西區','南化區','仁德區','關廟區','龍崎區','官田區','麻豆區','佳里區','西港區','七股區','將軍區','學甲區','北門區','新營區','後壁區','白河區','東山區','六甲區','下營區','柳營區','鹽水區','善化區','大內區','山上區','新市區','安定區',),'高雄市' => array('新興區','前金區','苓雅區','鹽埕區','鼓山區','旗津區','前鎮區','三民區','楠梓區','小港區','左營區','仁武區','大社區','岡山區','路竹區','阿蓮區','田寮區','燕巢區','橋頭區','梓官區','彌陀區','永安區','湖內區','鳳山區','大寮區','林園區','鳥松區','大樹區','旗山區','美濃區','六龜區','內門區','杉林區','甲仙區','桃源區','那瑪夏區','茂林區','茄萣區',       	),'屏東縣' => array('屏東市','三地門鄉','霧臺鄉','瑪家鄉','九如鄉','里港鄉','高樹鄉','鹽埔鄉','長治鄉','麟洛鄉','竹田鄉','內埔鄉','萬丹鄉','潮州鎮','泰武鄉','來義鄉','萬巒鄉','崁頂鄉','新埤鄉','南州鄉','林邊鄉','東港鎮','琉球鄉','佳冬鄉','新園鄉','枋寮鄉','枋山鄉','春日鄉','獅子鄉','車城鄉','牡丹鄉','恆春鎮','滿州鄉'   	),'台東縣' => array('臺東市','綠島鄉','蘭嶼鄉','延平鄉','卑南鄉','鹿野鄉','關山鎮','海端鄉','池上鄉','東河鄉','成功鎮','長濱鄉','太麻里鄉','金峰鄉','大武鄉','達仁鄉',   	),'花蓮縣' => array('花蓮市','新城鄉','秀林鄉','吉安鄉','壽豐鄉','鳳林鎮','光復鄉','豐濱鄉','瑞穗鄉','萬榮鄉','玉里鎮','卓溪鄉','富里鄉'   	), '澎湖縣' => array('馬公市','湖西鄉','白沙鄉','西嶼鄉','望安鄉','七美鄉'   	), '金門縣' => array('金城鎮','金湖鎮','金沙鎮','金寧鄉','烈嶼鄉','烏坵鄉'   	), '馬祖縣' => array('北竿鄉','南竿鄉','莒光鄉','東引鄉'   	),  );  return $cities;}

下一頁還有步驟3喔!

步驟3. 如何移除資料裡的國家覽位:

做完步驟1與2後, 基本上已經完成縣市與鄉鎮市的選單自動下拉功能, 而步驟3只是小修改
你可以在style.css或其他擴充css的地方, 加入以下的語法將國家的欄位隱藏起來, 看不見但還是有存在

.woocommerce-billing-fields #billing_country_field {display: none;}

完成如下:

下圖就是完成之後的樣子
記得要透過外掛 Woo Checkout Field Editor Pro 作客製化結帳欄位, 把順序調整一下, 再將不需要的東西移除!
OK!

更多參考:

2017/06/01

WP-PostViews外掛-好用的額外功能 可以透過API 操作與更改網址參數使用

更新:
另一個外掛 WordPress Popular Posts 也有類似功能, 鄉親可以自行研究看看

更改主循环排序,按照文章展示次数浏览

只要启用了WP-PostViews,你的网站就自动获得了这种排序浏览的方式
WP-PostViews还自带了排序功能,通常首页展示的文章是按照发布时间来排序的,你可知道只需要在url中添加一些参数就可以改变排序。例如

按照访问次数由多到少排序,尝试这样访问你的网站

http://yourdomain.com/?v_sortby=views

按照访问次数由少到多排序,添加这样的参数

http://yourdomain.com/?v_sortby=views&v_orderby=asc

WP-PostViews API

WP-PostViews定义的函数也可以单独调用,它提供的views小工具就是调用这些函数工作的。

<?php get_least_viewed($mode = '', $limit = 10, $chars = 0, $display = true) ?>//显示最冷门文章//$mode: post | page | both (相当于widget中的Statistics Type设置)//$limit: 显示多少篇文章//$chars: 标题长度//$display: 为true则直接显示,否则作为字符串返回
<?php get_most_viewed($mode = '', $limit = 10, $chars = 0, $display = true) ?>//显示最热门文章
<?php get_least_viewed_category($category_id = 0, $mode = '', $limit = 10, $chars = 0, $display = true) ?>//显示某个或某些目录下最冷门文
<?php get_most_viewed_category($category_id = 0, $mode = '', $limit = 10, $chars = 0, $display = true) ?>//显示某个或某些目录下最热门文章
<?php get_most_viewed_tag($tag_id = 0, $mode = '', $limit = 10, $chars = 0, $display = true) ?>//显示指定标签下的最热门文章
<?php get_least_viewed_tag($tag_id = 0, $mode = '', $limit = 10, $chars = 0, $display = true) ?>//显示指定标签下的最冷门文章
<?php get_totalviews(); ?>//显示全站文章总共被浏览过多少次

2017/05/05

2017信用卡繳房屋稅 優惠整理「免手續費、紅利積點、分期」(106年度)

5月報稅大月,包括免徵房屋稅的房屋現值、及高級房屋新課稅方式等2項細部修正,民眾可多加留意。信義代書指出,今年的房屋稅課徵,有2大變動,一是房屋現值在10.1萬~10.8萬元者,可免徵房屋稅。信義房屋代書林以德表示,過去僅侷限10萬元以下免稅,但今年放寬免徵門檻後,估計部分老舊房屋或是小套房等小坪數產品,可享受免稅優惠,各縣市受惠戶數在數百至數千戶,而每戶每年自今年起可省下稅金約1200多元。

林以德說:「符合新免徵規定的房屋,稅捐處將主動辦理免徵,並通知屋主,民眾不用擔心。」
此外,今年7月起台北市將適用新房屋標準價格,若是2014年7月後完工住宅負擔將可減輕,但2001年7月1日後完工的高級住宅,則將增加稅額負擔,但其稅負變化,將反映於明年的房屋稅單。(詹宜軒/台北報導)

延伸閱讀 ► 2017信用卡繳稅&所得稅報稅優惠「免手續費、紅利積點、分期」(106年度)

 

《中國信託》LINE Pay卡

●免手續費
●LINE Pay卡綁定LINE Pay帳號繳納房屋稅,享LINE Points 1%點數回饋無上限
●活動期間:即日起至106年5月31日止
●優惠資訊連結
●LINE Pay卡介紹

《玉山銀行》信用卡(分期需登錄)

●刷玉山卡繳稅,免手續費
●3期、6期0利率:5月不限金額,新增1筆一般消費,享3或6期0利率
●抽獎活動:刷卡繳稅,每一筆享一次抽獎機會,RIMOWA行李箱(5名)、西堤餐券2張(50名)
●MaterCard加碼抽:富士拍立得1台(20名)
●活動期間:即日起至106年6月2日止
●優惠資訊連結

  

《第一銀行》信用卡(分期需登錄)

●一次付清免收手續費
●3、6期0利率:單筆綜所稅/房屋稅款,滿3000元,可分3、6期0利率
●活動期間:106年5月1日止至106年6月2日止
●公司卡、由你分期卡、Visa金融卡、悠遊debit卡,不適用本活動
●優惠資訊連結

 

《台新銀行》全家刷台新信用卡( 需登錄 )

●免手續費
●5/1-5/31單月累積刷滿8,000送50元刷卡金,限量登錄15,000名(5/15開放登錄)
●4期0利率:單筆刷2,000,可申請4期0利率
●活動期間:106年4月26日止至106年6月2日止
●優惠資訊連結

 

《新光銀行》信用卡(分期需線上或專人申辦)

●免手續費
●4期0利率:單筆滿3000元,享4期0利率
●抽獎活動:抽墾丁華泰瑞苑住宿憑證(5名)
●活動期間:106年4月26日止至106年6月2日止
●優惠資訊連結

 

《大眾銀行》信用卡(分期需網銀申請)

●不限金額,免手續費
●3期0利率:於5月新增一般消費不限金額,享3期0利率
●活動期間:106年5月1日止至106年6月5日止
●優惠資訊連結

  

《聯邦銀行》信用卡(分期需登錄)

●免手續費:不限稅額免手續費
●3期0利率:單筆稅額滿3,000元,可分3期0利率
●活動期間:106年5月1日止至106年6月2日止
●優惠資訊連結
  

《陽信銀行》信用卡(分期需致電客服辦理)

●免手續費
●3期0利率:稅額單筆滿3,000元,可申請3期0利率
●活動期間:106年5月1日止至106年5月31日止
●優惠資訊連結

  

《永豐銀行》信用卡(分期需登錄)

●免手續費:代繳房屋稅免手續費
●3期0利率:單筆繳稅達10,000元以上,再享3期0利率
●100元百貨刷卡金:繳稅滿100,000元,送100元百貨刷卡金
●活動期間:106年5月1日止至106年6月2日止
●優惠資訊連結

  

《日盛銀行》信用卡(需登錄)

●免手續費
●稅後加油並登錄,106年5月至8月於全台加油站刷日盛卡,享3%回饋金(每月每戶上限100元)
●活動期間:106年4月26日止至106年6月2日止
●優惠資訊連結

 

《合作金庫》信用卡

●免手續費:世界卡/無限卡,免收手續費 /其他信用卡,繳納稅費之最近2個月,所有合庫卡一般消費1次,免收手續費
●分期0利率:無
●活動期間:106年5月1日止至106年5月31日止
●優惠資訊連結

  

《遠東商銀》信用卡

●免手續費:不限金額即享0手續費
●分期0利率:無
●紅利折抵:HAPPY GO 4點折抵1元,點數折抵無上限
●活動期間:106年5月1日止至106年5月31日止
●優惠資訊連結

 

2017/03/13

Windows利用批次檔(Batch)讀取指令執行的結果或文字檔案內容 for /f %i in ...

透過指令去了解「/f」到底有什麼魅力呢?

首先,括弧裡面可用三種模式:

for /f %i in (Test.txt) do echo %i ,
(檔案)
(“字串”)
(‘指令’)

因為預設是以空白(Space)或跳位(Tab)做切割,所以不是整行讀取。
for /f %i in (“This is a test.”) do echo %i

也會遇到一樣的問題。
for /f %i in (‘dir /b’) do echo %i

這樣就可以知道「/f」的魅力了吧?

以下用文字文件test.txt來解釋

在前面參數可以自訂以取得想要的結果,以下文字文件來解釋:

第一個「delims」:
for /f “delims=]” %i in (Test.txt) do echo %i
就是指定字元去分割字串,當然「]」不存在,所以整句會直接上去,預設是空白(Space)或跳位(Tab)。而下面這樣會比較好懂:

for /f “delims=a” %i in (Test.txt) do echo %i

二個字也行喔:
for /f “delims=ai” %i in (Test.txt) do echo %i


接下來是「skip」:

for /f “skip=1” %i in (Test.txt) do echo %i

就是第一行不要處理啦!

下一個是「eol」:
for /f “eol=$” %i in (Test.txt) do echo %i
就是前面有符號「$」不要處理啦!

下一個「tokens」比較複雜:
for /f “tokens=1,2,3” %i in (Test.txt) do echo %i %j %k
他是說,把字串以空白切出來,所以「This is a test.」會被切成「This」「is」「a」「test.」,而取其中第 1, 2, 3 段分別丟到 %i, %j, %k 中。這是「tokens」特殊用法,被切出來的會依序從原指令 in 前面的 %i 開始丟。

下面這樣也可以:
for /f “tokens=1,2,3” %i in (Test.txt) do echo %i %j %k
用連字號也沒有問題。

最後一個是沒有用過的「usebackq」:
for /f “usebackq” %i in (“Test.txt”) do echo %i
是指原本用來表示「(檔案)」改成「(“檔案”)」、「(“字串”)」改成「(‘字串’)」、「(‘指令’)」改成「(`指令`)」。應該是為了要避免跳脫字元的關係,但個人沒有過的原因那就直接用跳脫字元就好了啊!

補充一下:
for /f “eol=$ skip=1 tokens=1-4 delims=a” %i in (“Test.txt”) do echo %k
參數是可以混搭的,要注意「delims」有可能需要用空白,所以建議擺在最後一個,避免判斷錯誤。

其實到這邊就可以結束了,不過還是要提醒「/f」有很多方法可以用,如刪除每一槽下的「Autorun.inf」:
for /f %i in (‘mountvol ^| find “:\”‘) do del /s q %iAutorun.inf
就是一個很簡單的實例。

「for /f」實在是一個很實用的指令,但也是整個教學裡面最難學的。不過學完這個應該也會覺得還好,命令提示字元也不過爾爾,沒錯!的確沒有很難。下一章沒有新知識了,博君一笑罷了。

2017/03/10

微軟的Windows作業系統是怎麼裝驅動程式的呢? (How Windows Installs Devices)

(原文出處: 這裡)

  1. The New Device is Identified (第一步:識別設備,獲取設備標識(ID))
  2. A Driver for the Device is Selected (第二步:選擇最優驅動安裝包)
  3. The Driver for the Device is Installed (第三部:安裝驅動)

Step 1: The New Device is Identified

當一個設備插入到計算機總線後,總線驅動檢測到設備插入,然後給設備分配一串硬件ID(hardware identifier (ID))。
例如,插入一個USB Key插入到電腦後,分配的硬件ID為:

USB\VID_096E&PID_0807&REV_0100
USB\VID_096E&PID_0807

Windows就靠此ID來尋找最優的那個驅動安裝包。

硬件ID的格式如下:

  • A bus-specific prefix, such as PCI\ or USB\.
  • Vendor-specific identifiers for the device, such as a vendor, model, and revision identifier. The format of these identifiers within the hardware ID is also specific to the bus driver.

Hardware ID
A hardware ID is a vendor-defined identification string that Windows uses to match a device to an INF file. In most cases, a device has associated with it a list of hardware IDs. (However, there are exceptions ? see Identifiers for 1394 Devices ). When an enumerator reports a list of hardware IDs for a device, the hardware IDs should be listed in order of decreasing suitability.
通過MSND中的解釋可以了解到:硬件ID是一組ID值,如上面例子中的兩列字符串。

Device ID
A device ID is a string reported by a device’s enumerator. A device has only one device ID. A device ID has the same format as a hardware ID.
設備ID不是一組ID值,只有一個唯一ID值,他唯一標識了此類設備,設備ID和硬件ID的格式一樣,硬件ID中最能嚴格定義此類設備的ID值就為設備ID。如上面兩條ID值中,第一條能更加準確的定義此類設備,所以第一條也叫設備ID。

Compatible ID
A compatible ID is a vendor-defined identification string that Windows uses to match a device to an INF file. A device can have associated with it a list of compatible IDs. The compatible IDs should be listed in order of decreasing suitability. If Windows cannot locate an INF file that matches one of a device’s hardware IDs, it uses compatible IDs to locate an INF file. Compatible IDs have the same format as hardware IDs. However, compatible IDs are typically more generic than hardware IDs.

關於設備ID,硬件ID,兼容ID等概念,可以參考MSDN:http://msdn.microsoft.com/EN-US/library/windows/hardware/ff541224(v=vs.85).aspx,或者《竹林蹊徑:深入淺出Windows驅動開發》中的第十二章。這裡不需要深入了解。

在設備管理器中,可以瀏覽硬件ID:

可以看到,硬件ID不只一個,它是一組ID,其中,最嚴格定義了該類設備的ID也被稱作設備ID。如上圖中,第一個條USB\VID_096E&PID_0807&REV_100為設備ID。

Step 2: A Driver for the Device is Selected

第一步得到硬件IDs,Windows開始搜索驅動安裝包。這節解決幾個問題:

搜索的對比規則是什麼?
搜索順序是怎樣的?
搜索結果有多個驅動匹配,如何選擇最優?
搜索對比規則

每個驅動安裝包中,都有一個INF文件,此文件記錄了廠商定義的設備信息等內容。以某個廠商的智能卡私有驅動為例,其INF片段如下:

[Manufacturer]
%MFGNAME1%=DeviceListMfg1,NTamd64

[DeviceListMfg1.NTamd64]
%USB\VID_08E6&PID_3437.DeviceDesc% =DriverInstall64, USB\VID_08E6&PID_3437 ;
%USB\VID_08E6&PID_3438.DeviceDesc% =DriverInstall64, USB\VID_08E6&PID_3438 ;
%USB\VID_08E6&PID_3480.DeviceDesc% =DriverInstall64, USB\VID_08E6&PID_3480 ;
%USB\VID_08E6&PID_34EC.DeviceDesc% =DriverInstall64, USB\VID_08E6&PID_34EC ;

可以看到[DeviceListMfg1.NTamd64]中,定義了每個產品的VID,PID信息,諸如:USB\VID_08E6&PID_3437,就是廠商自己定義的硬件ID,Windows搜索INF這個區域,對比第一步得到的硬件IDs和INF中的硬件ID,如果能精確匹配,那說明此驅動包符合安裝條件。

我們接著分析微軟的通用智能卡驅動是如何實現的,我們知道,微軟不可能知道我們的設備的硬件ID信息,也就說,在INF中,不能將全世界廠商的硬件ID全部記錄在INF文件中。所以,微軟引入了兼容ID(compatible ID)。兼容ID和硬件ID的格式一樣,但它更加通用,能囊括一大類設備。它被廠商定義在INF文件中。如果Windows沒有找到對應的硬件ID,它會去比對INF中的兼容ID,找到對應的驅動安裝包。

以微軟XP的CCID驅動為例,usbccid.inf中的片段:

[Manufacturer]
%CCID%=CCID,NTamd64

[CCID.NTamd64]
%USBCCID.DeviceDesc% = USBCCID.Install,USB\Class_0B&SubClass_00

此處的USB\Class_0B&SubClass_00,就是兼容ID,在設備管理器中也能顯示兼容ID:

驅動包的搜索順序

Windows搜索INF文件的位置,是按照一定規則來執行的,不同的操作系統,搜索順序會有所不同:

Search phase

Windows Server 2003, Windows XP, and Windows 2000

Windows Vista and
Windows Server 2008

Windows 7 and later versions of Windows

Without user interaction

DevicePath

Driver store

Windows Update

Driver store

DevicePath

With user interaction

Prompt for distribution media

Windows Update

DevicePath

Windows Update

Prompt for distribution media

Not applicable

DevicePath對應的路徑存儲在註冊裡:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion下,定義了DevicePath字符串鍵值。通常,對應的目錄為 Windows\inf。

Driver store在Vista以後,對應的路徑為:Windows\System32\DriverStore\FileRepository。 Vista以前的系統,路徑為:Windows\Driver Cache。從Vista以後的系統,系統開始重用Driver Store,如果找到一個匹配的驅動包,第一步就是先把這個安裝包拷貝到Driver Store中,然後安裝過程在Driver Store中進行。

下面舉例說明:

當前系統如果為Vista,當一個用戶插入一個智能卡到USB hub中時:

USB 總線驅動為智能卡創建一串硬件IDs,Windows首先會搜索Driver store(Windows\System32\DriverStore\FileRepository)中的INF文件。
如果未找到合適的驅動包,Windows啟動 添加新硬件嚮導,在嚮導裡,用戶可以選擇從Windows Update搜索(聯機搜索),也可以自己指定INF安裝路徑。

選擇聯機搜索,Windows搜索順序如下:

DevicePath(Windows\inf)
Windows Update
如果搜索不到,提示用戶插入光盤、軟盤,或者指定驅動包位置

如果驅動包找到,Windows將驅動包運輸(Staging)到Driver Store(Windows\System32\DriverStore\FileRepository)中。
當前系統如果為Win7,當一個用戶插入一個智能卡到USB hub中時:

USB 總線驅動為智能卡創建一串硬件ID,Windows首先會搜索Windows Update,如果找到,將驅動運輸到Driver store(Windows\System32\DriverStore\FileRepository)中。
如果未找到合適的驅動包,Windows繼續搜索Driver store(Windows\System32\DriverStore\FileRepository)和DevicePath(Windows\Inf).
如果找到了安裝,如果未找到,安裝失敗。
Win7不會自動運行安裝嚮導來讓用戶選擇驅動包,但這個嚮導仍然存在,在設備管理器中,選擇未識別的設備,右鍵,選擇更新驅動,同樣能夠達到安裝的目的。

選擇最優驅動包

搜索完成後,可能會有多個驅動包匹配成功,如不同版本號的驅動都匹配成功了。如何進一步篩選,選出最優驅動包?

如果Windows只找到一個驅動包,那好說,直接安裝。
如果Windows找到不只一個驅動包,Windows為每個驅動包的匹配度進行打分,打分最低的那個,就是最優的那個。
如何給驅動打分,有一套規則,規則比較複雜,打分在vista之前和vista之後會有所不同,有所不同,可以參考MSDN:http://msdn.microsoft.com/EN-US/library/ff686700(v=VS.85,d=hv.2).aspx

這里大致說明一下,影響分值有幾個因素:

驅動是如何被簽名(微軟簽名?第三方簽名?未簽名?等)
驅動ID是如何匹配的(根據硬件ID?根據兼容ID?等)
… …
如果打分最低的有多個(就是倒數並列第一的概念),Windows使用如下規則,進一步篩選:
是否已被簽名
通過INF的Version節中的DriverVer字段值判斷哪兒個版本最新,就選哪個。
下面摘自《竹林蹊徑:深入淺出Windows驅動開發》一個解釋片段:

Step 3: The Driver for the Device is Installed

選擇好了驅動,就開始安裝驅動了,安裝驅動的步驟如下:

通過INF文件中的CopyFiles指令,拷貝二進製文件(驅動和其他文件)到指定目錄
如果INF 中有DDInstall.Coinstallers段,註冊device-specific co-installer。 co-installer是一個DLL庫,是為了輔助設備驅動安裝的一個庫,它主要做一些在INF文件中無法描述的操作。例如,添加一些額外的信息到註冊表,讀取註冊表的一些關鍵信息用以執行不同的操作,安裝完成顯示完成頁面等。關於Co-installer更多的信息,可以參考MSDN:http://msdn.microsoft.com/EN-US/library/windows/hardware/ff554011(v=vs.85).aspx
讀取INF中的Class 和 ClassGuid字段,將設備進行歸類(軟件方式歸類,如將一個插入的鼠標歸類為Mouse,將所有的智能卡設備歸類為SmartCard)。如果此Class是一個系統中不存在的設備類型,廠商需要提供 類安裝庫(class installer),來安裝設備類。這也是一個DLL,而且類安裝過程中,也可以有class co-installers輔助安裝庫,具體信息參考MSDN:http://msdn.microsoft.com/EN-US/library/windows/hardware/ff554009(v =vs.85).aspx
當所有的驅動和co-installders都被註冊,Windows將控制權交給Plug and Play (PnP) manager,它負責加載和驅動設備。
PNP管理器首選調用驅動入口函數:DriverEntry,接著調用AddDevice,……,發送IRP_MN_START_DEVICE給驅動設備對象。驅動開始工作。

2017/02/16

Windows重覆開機reboot測試範例 - batch file

常常需要自動重新開機的測試, windows7 設定開機自動啟動某應用程式, 先建立將要啟動的程式捷徑。

如下面的run.bat , 將此捷徑複製到以下目錄位置。
C:\Users\使用者帳號\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
以後開機就會自動啟動這個程式了。

重覆開機測試範例 run.bat :

@echo off  不輸出指令start /wait C:\test1.bat 開新視窗去執行令一個batch檔, 且會等待他執行完ping 127.0.0.1 > nul 另類等待數秒的做法set rootpath=C:\Users\xxxxx\Desktop\test  設定環境變數set day=20120111set logfile=%rootpath%\%day%\log.txtfindstr /C:"A123456789" E:\result.xml 在檔案裡面搜尋關鍵字if %errorlevel%==1 goto Fail  若為1表示沒找到if %errorlevel%==0 goto pass  若為0表示有找到echo %time%: Fail >> %logfile% 若走到此表示其他錯誤cls  清螢幕color 8c 改字體顏色pause 暫停:passecho %time%: PASS >> %logfile%  輸出文字到log檔案goto end:Failclsecho %time%: NOT Found >> %logfile%echo.echo-----------------------------------echo		NOT Foundecho-----------------------------------echo.color 8cpause:endshutdown /r /t 1 在一秒後自動重開機

什麼是GPT什麼是MBR,NTFS又是什麼東西?

網路上很多人討論與解釋GPT、MBR、NTFS,不過總是長篇大論,以下有個簡易的了解方法,讓大家簡顯易懂:GPT、MBR、NTFS基本上都是存於電腦硬碟中的格式。我們將硬碟比喻成是一間圖書館。GPT與MBR就好比圖書館中的書架。

  • GPT可在大型圖書館中放很多書架(硬碟可支援到18ET〈1887萬TB〉,可分割128磁區)。
  • MBR只適合小型圖書館中擺放的書架(硬碟支援到2TB,最多可分個4個主要磁區)。
  • NTFS就好比書架上的書,供圖書館人員編排書籍使用,所以NTFS同時可存於GPT與MBR兩種格式中。

搞清楚GPT跟MBR的差別

硬碟愈來愈大,傳統電腦中的BIOS卻只能定位到2TB左右的容量,超過的空間就無法使用,這是因為BIOS所採用的磁碟分割方式為「MBR」

MBR(Master Boot Record)
只能定址約2TB左右的大小(2.2 × 1012位元組),而且也只支援最大4個主分割區,也就是如果你有一顆3TB以上的硬碟,一定無法只分割為一個分割區而能用完全部容量。

因此各家主機板廠商紛紛推出新一代的UEFI BIOS,如此才能解決硬碟的辨識問題,所以UEFI的出現不是光為了讓BIOS圖形化更容易使用,更是為了要支援「GPT」這個硬碟分割格式,它才能支援3TB以上的大容量硬碟喔!

GPT(GUID Partition Table)
從特性上看來,確實比MBR優秀不少,光是可以支援最大容量到18EB(約為1887萬TB),以及分割區最大可以到128個,就足夠打到MBR站不起來了。

從Windows Server 2003以後的微軟系統,都可以讀寫GPT分割區,蘋果電腦從OS X開始也都開始支援,不過除了少數Linux系統以外,幾乎都只支援從UEFI來啟動GPT,並不能從BIOS中開機,因此以微軟Windows來說,目前就分為BIOS+MBR以及UEFI+GPT兩種開機方式,撇除開機時的不同,在進入系統以後的操作方式及功能,都是完全相同的,最大不同只差在支援的硬碟大小跟數量。

我只知道我的硬碟是NTFS,這跟MBR或GPT有關係嗎?

又是MBR、GPT又是NTFS的,確實很讓人摸不著頭緒。如果把硬碟空間當作一座圖書館的話,分割區MBR及GPT是一個個書架,讓你可以放置書籍,不用把書全部堆在地上亂糟糟。而NTFS/FAT32等就是書架上的書的排列方式,所以我們可以稱MBR及GPT為「分割區」,而NTFS/FAT32等檔案格式就是「分割表」。

那這麼說來,不管硬碟多大,一律分割成GPT磁區不就好了,既是未來的趨勢,新的格式用起來爽度也夠,不過GPT也不是完全只有優點,雖然說在系統碟格式化成GPT並安裝Windows 7/8用起來根本不會有問題,不過如果你還要把這顆硬碟安裝到其他舊系統(如XP)的電腦,就很有可能會讀不到囉!

GPT會多分割出了好幾塊空間

還有GPT硬碟因為相容性的關係,明明你只是要分割一個主分割區,卻一次就多分出了好幾塊空間,看起來相當礙眼,為什麼會這樣呢?

GPT分割區因為是新格式,不免會與舊系統或硬體共用,但是舊版系統跟硬碟分區軟體有可能會不認得GPT啊!因此GPT分區在建立時也會順便建立一個性質為「Protective MBR」的分割區,以免無法辨識GPT分割區的軟體誤將檔案內容破壞。因此通常在使用Windows 8光碟安裝UEFI系統時,除了產生安裝系統的主分割區以外,還會有以下3個分割區:(這裡有分隔的圖)

  • 修復分割區(約300MB):這個分割區是微軟獨有,用來在需要修復系統的情況,供給Windows RE(Windows Recovery Environment)存取之用。
  • ESP分割區(約100MB):非必須存在,放置UEFI啟動檔案,在開機時UEFI BIOS會讀取這塊區域,檔案格式為FAT32。
  • MSR分割區(約128MB):必須存在,就是前面所說的Protective MBR,當這顆碟安裝到不支援GPT的系統或硬碟管理軟體時,由於它們只會讀取到此分割區,就不會破壞GPT主分割區中的檔案了。

由於以GPT方式分割硬碟實在是分太多區塊了,因此有的網友認為2TB以內的硬碟在安裝系統時只要用傳統的BIOS+MBR安裝即可。

而且用SSD來安裝系統已經漸漸成為趨勢,目前SSD的主流大小在128~256GB左右,更是不能任意浪費空間,即使GPT分割區實在是好處多多,但MBR也還尚未過氣,一般電腦使用仍綽綽有餘。

Boot Process 與命令列工具BCDEdit用於管理 BCD (開機設定資料)存放區

提到bcdedit, 大部分就是跟bios,多重開機,secure boot,winPE,…etc有點關係, 因為 bcdedit就是去編輯BCD資料的指令! 所謂的開機設定資料 (BCD) 檔案, 就是提供一個存放區, 可用於說明開機應用程式和開機應用程式設定。所以說 BCDEdit 為命令列工具, 可用於管理 BCD 存放區。它可用於各種不同的目的,包括建立新的存放區、修改現有的存放區、新增開機功能表選項等。BCDEdit 本質上可提供與舊版 Windows 上之 Bootcfg.exe 相同的目的,但有兩項重大改進:
BCDEdit 顯示比 Bootcfg.exe 範圍還要廣泛的開機選項。

開機管理程式設定

Windows 開機管理程式位於識別元 {bootmgr} 下的 device 與 path 設定,必須指向正確的磁碟分割與可執行檔。其他設定可以參考修改 BCD 存放區範本
在 Windows Vista 的 BCD 範本中,有如下的這些設定:

Windows 開機管理程式--------------------identifier              {bootmgr}device                  partition=C:path                    \EFI\Microsoft\Boot\bootmgfw.efidescription             Windows Boot Manager

在 Windows Server 2008 的 BCD 範本中,有如下的這些設定:

Windows 開機管理程式--------------------identifier              {bootmgr}device                  partition=\Device\HarddiskVolume1path                    \EFI\Microsoft\Boot\bootmgfw.efidescription             Windows Boot Manager

兩種模式(Legacy 32bits / UEFI 64bits )的 bcd檔:

  • Legacy 32bits
    • C:\boot\bcd
  • UEFI 64bits
    • C:\elf\microsoft\boot\bcd
  • 或是兩種皆支援的hybrid mode

(出處:Repair Windows BCD – Windows 10/8.1/7/Vista)
In Windows Vista, Windows 7, Windows 8/8.1 and Windows 10 the System Boot Configuration Data (BCD) is stored in a file in folder “\Boot”.

The full path to this file is “[active partition]\Boot\BCD“.
(On UEFI/GPT the full path is “[EFI system partition]\EFI\Microsoft\Boot\BCD“)

Windows NT6 (Vista, Windows 7/8/10) BIOS/MBR boot process depends on the presence of an active partition on hard disk.
(On UEFI/GPT boot process depends on the presence of EFI System Partition(ESP) on hard disk)

BIOS/MBR boot process from hard disk goes like this:

  1. BIOS firmware initialization and self test (Power On Self Test – POST)
  2. load and execution of MBR (Master Boot Record) on first disk
  3. load and execution of partition boot record (PBR) on active partition
  4. load and execution of boot manager (“\bootmgr”) from active partition and then display of boot menu (skipped if only one boot entry)
  5. load and execution of Windows NT6 loader – file “winload.exe” from \Windows\System32 folder
  6. load and execution of kernel and drivers

The active partition (also a primary partition) can be mapped to a drive letter like c:, d: or be the unmapped “System Reserved” partition. You can use Disk Management or diskpart.exe to view and set the active partition.

If BCD resides on an unmapped active partition the full path is “\Device\HarddiskVolumeN\Boot\BCD” where N is a number starting from 1. If active partition is mapped to c: drive then the full path to system BCD is “c:\Boot\BCD”.

UEFI/GPT boot process from hard disk goes like this:

  1. UEFI firmware initialization
  2. load and execution of first boot candidate (first entry in NVRAM boot order – usually Windows firmware boot manager(\EFI\Microsoft\Boot\bootmgfw.efi))
    – no master(MBR) and partition boot record(PBR) code used!
  3. display of Windows boot menu (skipped if only one boot entry)
    (it is not clear what’s the purpose of Windows boot manager (“\EFI\Microsoft\Boot\bootmgr.efi”) – should be investigated)
  4. load and execution of Windows NT6 loader – file “winload.efi” from “\Windows\System32” folder
  5. load and execution of kernel and drivers

And here a visualization of Windows UEFI boot process from an UEFI Plugfest – Windows boot environment by Murali Ravirala from Microsoft.

轉錄-Boot Process and BCDEdit

(出處)The new boot environment supports both BIOS and Unified Extended Firmware Interface (UEFI) firmware models. It uses a new data store for boot configuration data (the BCD store) that replaces Boot.ini and provides new boot applications that replace the previous Windows® loader (Ntldr.exe), including a new Windows boot manager and Windows boot loader.

What does the boot process do?
When a computer is turned on, it must perform a variety of tasks before it is ready to start running applications. To accomplish these tasks, the computer runs startup software that resides in the firmware. This software (a “boot loader”) locates and initializes the operating system kernel and prepares access to hardware devices before the operating system is ready to start running applications. The boot loader is typically independent of a specific operating system, but it can locate the code to start the next step, which is the operating system–specific phase of system startup. The boot loader and related boot configuration information is often stored in system files that are separate from the operating system, application programs, and user data.

Are there any special considerations?
You must have administrative rights to change the boot configuration for Windows. To change the boot configuration, start the boot configuration application BCDEdit.exe from a command prompt with administrative rights. Be aware that changing the boot configuration can make the system unable to start. To avoid problems with this, make a backup copy of the current boot configuration ahead of time by using the bcdedit /export save-bcd command.

Support for both BIOS and UEFI firmware
UEFI is the next generation of firmware architecture that is designed to replace the BIOS architecture. The new Windows boot environment is designed for both BIOS and UEFI and uses a common data store that can exchange boot configuration information between the firmware, the boot loader, and boot applications.

New boot applications
The functionality that was previously combined in Ntldr.exe is now separated into multiple applications:

  • Windows Boot Manager (Bootmgr.exe or Bootmgr.efi). This application is independent of the operating system and uses the firmware to load the Windows boot loader either from a particular disk partition or over a network connection (in the case of network boot).
  • Windows Boot Loader (Winload.exe or Winload.efi). This application is part of the operating system and loads a specific version of Windows. It uses the firmware to load the operating system kernel and to boot critical device drivers from a local hard disk.
  • Windows Resume (Winresume.exe or Winresume.efi). Windows Resume finds a hibernation image and then uses the firmware to read the hibernation file into RAM and to resume the operating system from the hibernation state.

The Windows boot environment also includes the Windows Memory Tester (Memdiag.exe or Memdiag.efi). You can start this diagnostic tool from the boot manager to verify that RAM is working correctly.

New data store that replaces Boot.ini
The Boot Configuration Data (BCD) store replaces the text-based Boot.ini file. In the BCD store, the Windows boot manager, the Windows boot loader, and other boot applications are represented as program objects (GUIDs) instead of text items. A new tool, BCDEdit.exe, enables you to use basic and extended commands to modify these objects in order to control all aspects of the boot process. Although the data store represents each object with a GUID, some objects have alias names for common use, such as {bootmgr} (which refers to boot manager) and {default} (which refers to the default Windows boot loader). Applications can modify boot configuration data by using a new BCD Windows Management Instrumentation (WMI) provider.

You can use the standard system application Msconfig.exe to provide a graphical interface for viewing and modifying a subset of the boot configuration settings. You must run Msconfig.exe with administrative rights.

 

轉錄-修改windows7啟動項的詳細步驟

(出處)發現win7下無法像XP下直接修改C:/boot.ini即可,需要在管理員權限下使用bcdedit命令操作。記錄如下:
Bcdedit簡介

  • 在NT60系列操作系統(Windows 7/Vista/2008)中的一個命令行工具,用於建立和重新配置bootloader,後者無須再使用boot.ini文件。
  • 也就是說,使用BCDEdit這個工具,能夠修改NT60 系列系統的啟動菜單在之前基於NT50系列(Windows XP/2000/2003)的Windows系統中,Windows使用Ntldr作為Boot Loader來啟動系統,但在新的NT60系列系統中,微軟引入瞭一種全新的boot loader架構,Windows Boot Manager (Bootmgr.exe)。
  • 與Ntldr嚴重地依賴於硬件不同的是,NT60中的新架構可以實現完整的硬件獨立性,且能夠與多種操作系統無縫結合,讓NT60的啟動/引導過程更加快速與安全。
  • 同時,將之前Windows 系統中由Boot.ini管理的內容移交給新的Boot Configuration Data (BCD : 啟動設置數據),當然,也提供瞭新的啟動選項編輯工具,BCDEdit (BCDEdit.exe),來管理啟動設置。
  • ——所謂boot loader,在指在內核運行之前執行的一段小程序,系統通過它來初始化硬件設備、建立內存空間的映射圖等,將系統的軟硬件環境設置成一個合適的狀態,為最終調用操作系統內核準備好正確的環境。
  • ——在啟動過程中,Ntldr 使用Boot.ini 文件來確定在啟動/引導過程中要顯示哪些操作系統選項,我們對啟動選項的設置可以通過修改boot.ini文件中相應內容實現。
  • Windows NT60 (Windows 7/Vista/2008)與早期NT52 系列系統(Windows XP/2000/2003)啟動的對比
    • 在傳統的基於BIOS的計算機中,如果只安裝NT60 系列操作系統(Windows 7/Vista/2008),您將會發現Boot.ini 文件已經徹底從系統中消失;如果系統中安裝瞭NT60 和之前的Windows 系統,如NT52 系列操作系統 (Windows XP/2000/2003),雖然仍可找到Boot.ini 文件,不過,這個文件只作用於那些系統,而不會對NT60 的啟動有任何影響。
    • 而在基於EFI (Extensible Firmware Interface : 可擴展固件接口,以後采用這種接口的PC會越來越多)的計算機中,Boot.ini 文件則更不復存在,在基於EFI的系統中,啟動選項被貯存在主板的存儲器中。此時要修改啟動選項,要麼通過能夠讀寫NVRAM的工具如NvrBoot,要麼使用上文提到的BCDEdit。
    • 由此可見,在NT60中,想要再像之前NT52 中那樣通過一個簡單的文本編輯器來修改Boot.ini(或用NT52自帶工具Bootcfg)的方式來管理啟動選項已經不可能瞭,要對啟動設置進行修改,只能使用命令格式相對要復雜得多的BCDEdit。
  • 此外,微軟也在NT60 中提供瞭可通過WMI (Windows Management Instrumentation : Windows管理規范)調用的BCD 類,通過它可以用編程的方式修改BCD數據。不過,相信對絕大多數根本不會接觸編程的用戶而言,這更是不可能的任務。

BCDEdit 使用前註意

  • 1.工具性質: command line tool
    • 需要註意的是,BCDEdit不是一個運行於圖形界面下的程序,而是一個命令行工具,該文件(Bcdedit.exe) 位於 “\Windows\System 32”目錄下。
  • 2.啟動
    • 要執行BCDEdit,首先應進入命令行窗口,並要將操作用戶並提升至管理員權限。另外,該工具依賴於參數,如果不帶參數,則不能正常使用。
    • 在命令行窗口中,轉到系統目錄如 “C:/windows/system32”下,然後輸入“bcdedit <參數>” 即可。也可直接在任意目錄運行,因為System32目錄本身在環境變量“Path”的范圍內。
  • 3.BCDEdit命令核心
    • (1)幫助
      • bcdedit /? : 顯示全部的命令幫助(都隻是概述)。
      • bcdedit.exe /? <命令> : 顯示指定命令參數的詳細信息(無需帶斜杠)。使用中對其他任何可用參數也均可使用本命令格式查看該參數的具體說明。
    • (2)Enum
      • 通過命令行工具Bcdedit,我們可以添加、刪除及修改BCD (Boot Configuration Data)中的對象。
      • 在BCD中,每個對象均具有唯一的GUID (Globally Unique Identifier : 全局唯一標識符),如系統中的每塊硬盤、每個分區的GUID (全局唯一標識符)均不相同。
      • 在BCD中,硬盤或分區的GUID可分為如下幾類:
        • {ntldr}: 指存在上代NT50系列操作系統(Windows XP/2000/2003)的硬盤或分區;
        • {default}: 默認所在硬盤或分區;
        • {current}: 當前硬盤或分區;
        • {}: 類似於這個格式的GUID指其他安裝瞭操作系統的硬盤或分區。
      • (註:相應的GUID可通過“bcdedit ”或“bcdedit /enum all ”命令查看。這樣會顯示BCD當前的啟動設置數據,包含瞭所有在BCD記錄中的操作系統,均能顯示其GUID,用戶可以此作更改啟動數據的參考。)
    • (3)保險措施(使用BCDEdit備份與恢復啟動選項)
      • 在對Windows NT60的啟動選項修改之前,最好先對其備份,以防萬一操作失誤或其他故障導致系統無法啟動。
        • bcdedit /export <目錄> : 將啟動設置備份到指定的目錄下;
        • bcdedit /import <目錄> : 恢復之前備份在指定目錄下啟動選項。
      • 註:當需要還原備份的啟動選項時,應仔細檢查備份的啟動選項是否對應於自己所需要的,否則重新設置會比較麻煩。

使用BCDEdit修改啟動菜單選項

  • 作為一種良好的操作習慣,在對Windows Vista的啟動選項進行任何修改前,首先要對BCD中的啟動選項進行備份,相應的命令上頁我們已介紹過,在此不再贅述;其次,使用“bcdedit ”或“bcdedit /enum all ”來查看系統中硬盤或分區的正確GUID 標識,並將其記錄下來。
  • 畢竟,BCDEdit只是一款命令行工具,我們操作時需手動輸入類似“”這樣的長字符串時,很容易出錯,而這往往會導致Windows Vista啟動失敗。
  • 下面詳細介紹使用BCDEdit修改啟動選項的常用命令格式:
    • bcdedit /set {ntldr} Description “Windows XP Professional SP2”: 修改上一代在啟動菜單中的顯示內容,比如說我們也可將其修改為“Vista天地de專用XP SP2”之類。註意,命令中的引號不可省略;操作系統
    • bcdedit /set {current} description “Windows Vista Build 5270 x86″: 修改當前啟動硬盤或分區上的操作系統在啟動菜單中的顯示內容。註意,當前分區上的操作系統可能為Windows Vista,也可以是其他系統,當然,命令中的引號也不可省略;
    • bcdedit /set {} description “Windows Vista Build 5270 x64”: 修改安裝於其他硬盤或分區的系統在啟動菜單中的顯示內容,使用這項命令時一定要註意該硬盤/分區的GUID輸入正確,相應的GUID可通過“bcdedit ”或“bcdedit /enum all ”命令查看。
    • bcdedit /default {current} :將當前啟動硬盤/分區中的操作系統設置為默認啟動的系統;
    • bcdedit /default {} :設置指定GUID上的操作系統為默認啟動的系統;
    • bcdedit /default {ntldr} :設置上一代Windows 系統Windows XP為默認啟動的系統;
    • bcdedit /displayorder : 設置啟用菜單中各項的顯示順序,如:
    • bcdedit.exe /displayorder {ntldr} {current} :將首先顯示Windows XP,然後再顯示默認啟動的系統如Windows Vista;
    • bcdedit /timeout 15 :將默認的啟動菜單顯示時間30秒更改為15秒,當然,您可以將這個時間修改為任何您希望的數值。
    • 使用BCDEdit修復硬盤/分區結構錯誤
      在對啟動選項的修改過程中,如添加或刪除某個硬盤/分區時,可能會因操作中的不慎導致硬盤/分區結構的混亂,除瞭采用恢復修改前的備份方法外,也可以首先使用BCDEdit來嘗試一下修復。具體方法如下:

X:\>X:\boot\fixntfs.exe -lh -all : 這時的“X: ”指引導目錄 “boot” 所在的硬盤/分區;
bcdedit /set device partition=X: : 將指定GUID的分區設為啟動分區。註意,這裡的“X: ”的GUID須與指定值不同,同時,搜狗電腦網,運行該命令後,必須接著運行下面的osdevice命令;
bcdedit /set osdevice partition=X: : 將指定GUID的分區設為啟動分區。註意,這個命令必須與上面的device命令配對使用,同時“X: ”的GUID須與指定值不同。

 

Bcdedit命令詳解,自定義Vista啟動管理項

Bcdedit 位於X:\Windows\system32\ “X:”為安裝Vista的盤符。

儲存操作指令
====================
/createstore 創建一個新的空白啟動配置數據文件。
bcdedit /createstore C:\Data\BCD 創建BCD啟動配置數據文件儲存到“C:\DATA\”文件夾。
/export 備份啟動配置數據文件。
bcdedit /export “C:\Data\BCD Backup” 備份BCD啟動配置文件到“C:\Data\”文件夾,並以“BCD Backup”命名。
/import 還原啟動配置數據文件。
bcdedit /import “C:\Data\BCD Backup” 從“C:\Data\”文件夾恢復BCD啟動配置文件。

儲存項目操作指令
====================
/copy 項目拷貝
操作系統啟動項目的拷貝:
bcdedit /copy /d “Copy of entry”
/create 新建項目
創建操作系統載入程序項目的NTLDR(Ntldr):
bcdedit /create /d “Earlier Windows OS Loader”
創建存儲器磁碟另外的選擇項項目:
bcdedit /create /d “Ramdisk options”
創建一個新的操作系統啟動項目:
bcdedit /create /d “Windows Vista” /application osloader
創建一個新的調試器:
bcdedit /create /d “Debugger Settings”
/delete 刪除項目
刪除指定的操作系統項目:
bcdedit /delete
刪除指定的操作系統項目但啟動時不顯示項目(徹底刪除):
bcdedit /delete /cleanup
刪除指定的操作系統項目但啟動時顯示項目:
bcdedit /delete /nocleanup
刪除操作系統載入程序項目的NTLDR:
bcdedit /delete /f

項目選擇操作指令
====================
/deletevalue 刪除項目選擇項。
刪除啟動管理的bootmgr選擇項項目:
bcdedit /deletevalue bootsequence
刪除(WinPE)操作系統的數值開機項目:
bcdedit /deletevalue winpe
刪除來自指定的操作的Windows PE 數值系統開機項目:
bcdedit /deletevalue winpe
/set 設定項目選擇項數值。
設定操作系統“cbd971bf-b7b8-4885-951a-fa03044f5d71”引導分區“C”:
bcdedit /set device partition=C:
指定的操作系統引導文件“windows\ system 32\ winload.exe”:
bcdedit /set path \windows\system32\winload.exe
設定“NX”為“OptIn”:
bcdedit /set nx optin
更改系統名稱
默認XP系統名稱在Vista啟動管理器中是”earlier version of Windows”,更改:
bcdedit /set Description “Windows XP Professional SP2″
默認Vista系統名稱在Vista啟動管理器中是”Microsoft Windows”,更改:
bcdedit /set Description “Windows Vista 5456”
輸出控制指令
====================
/enum 在儲存中的列表項目。
列出所有的操作系統載入程序啟動項目:
bcdedit /enum OSLOADER
列出所有的啟動管理項目:
bcdedit /enum BOOTMGR
列出默認的啟動項目:
bcdedit /enum
列出指定的操作系統啟動項目:
bcdedit /enum
/v 列出所有活動的項目
bcdedit /enum ACTIVE /v

啟動管理控制指令
====================
/bootsequence 設定啟動列表順序。
設定二個操作系統項目和啟動順序:
bcdedit /bootsequence {cbd971bf-b7b8-4885-951a- fa03044f5d71}
加入操作系統項目為啟動列表最後項:
bcdedit /bootsequence /addlast
/default 設定默認啟動項目。
設定默認啟動項目:
bcdedit /default
設定默認啟動操作系統程序為NTLDR:
bcdedit /default
/displayorder 設定哪一個系統啟動顯示多啟動畫面。
設定二個操作系統項目和在啟動管理顯示命令中被建立操作系統載入的程序NTLDR:
bcdedit /displayorder
把指定的操作系統項目加入啟動管理顯示命令結束:
bcdedit /displayorder /addlast
/timeout 設定啟動暫停數值。
/toolsdisplayorder 設定命令在哪一個啟動管理顯示工具畫面。
設定二個工具項目和內存診斷在那啟動管理工具顯示命令:
bcdedit /toolsdisplayorder
把指定的工具項目加入啟動的結束管理工具顯示命令:
bcdedit /toolsdisplayorder /addlast

為一個啟動應用程序控制緊急處理服務的指令
====================
/bootems
開啟啟動管理緊急處理服務:
bcdedit /bootems ON
/ems
為目前的操作系統啟動項目EMS 開啟:
bcdedit /ems ON
/emssettings 設定緊急處理服務參數。
設定EMS 參數使用基本輸出入系統設定:
bcdedit /emssettings BIOS

實際上,大家打開命令提示符,輸入 bcdedit /? 同樣可以獲得更詳盡的幫助:

BCDEdit 命令列選項

BCDEdit.exe 有下列可用的命令列選項。
BCDEdit / Command [Argument1] [Argument2] …

  • /createstore
    建立新的且空的開機設定資料存放區。建立的存放區並非系統存放區。
  • /export
    將系統存放區的內容匯出至檔案。這個檔案稍後可用於還原系統存放區的狀態。這個命令僅對系統存放區有效。
  • /import
    利用先前使用 /export 選項所產生的備份資料檔案,還原系統存放區的狀態。這個命令會在進行匯入之前,先刪除任何存在於系統存放區中的項目。這個命令僅對系統存放區有效。
  • /store
    這個選項可用於大部分的 BCDedit 命令,以指定要使用的存放區。如果未指定這個選項,則 BCDEdit 會在系統存放區上操作。自行執行 bcdedit /store 命令,相當於執行 bcdedit /enum active 命令。
  • /copy
    在相同的系統存放區中,製作指定之開機項目的複本。
  • /create
    在開機設定資料存放區中建立新項目。如果指定了通用的識別元,則無法指定 /application、/inherit 及 /device 選項。如果未指定識別元或不是通用的識別元,則必須指定 /application、/inherit 或 /device 選項。
  • /delete
    從指定的項目刪除元素。
  • /deletevalue
    從開機項目刪除指定的元素。
  • /set
    設定項目選項值。
  • /enum
    列出存放區中的項目。/enum 選項是 BCEdit 的預設值,因此執行 bcdedit 命令時,若未加上選項,則相當於執行 bcdedit /enum active 命令。
  • /v
    詳細資料模式。通常任何通用的項目識別元都會以好記的簡短形式呈現。指定 /v 作為命令列選項,會將所有的識別元全部顯示出來。自行執行 bcdedit /v 命令,相當於執行 bcdedit /enum active /v 命令。
  • /bootsequence
    指定一次性顯示順序,以用於下一次開機。這個命令類似於 /displayorder 選項,唯一的不同在於它僅用於下一次電腦啟動時。之後,電腦會還原為原本的顯示順序。
  • /default
    指定在逾時過期時,開機管理程式要選取的預設項目。
  • /displayorder
    指定向使用者顯示開機選項時,開機管理程式要使用的顯示順序。
  • /timeout
    指定在開機管理程式選取預設項目之前,要等候的時間 (以秒為單位)。
  • /toolsdisplayorder
    指定顯示 [工具] 功能表時,開機管理程式要使用的顯示順序。
  • /bootems
    啟用或停用指定項目的緊急管理服務 (EMS)。
  • /ems
    啟用或停用指定之作業系統開機項目的 EMS。
  • /emssettings
    設定電腦的全域 EMS 設定。/emssettings 不會啟用或停用任何特定開機項目的 EMS。
  • /bootdebug
    啟用或停用指定之開機項目的開機偵錯工具。雖然這個命令可用於任何的開機項目,但它僅對開機應用程式有效。
  • /dbgsettings
    指定或顯示系統的全域偵錯工具設定。這個命令不會啟用或停用核心偵錯工具,請針對該用途使用 /debug 選項。若要設定個別的全域偵錯工具設定,請使用 bcdedit /setdbgsettings type value 命令。
  • /debug
    啟用或停用指定之開機項目的核心偵錯工具。

轉錄-Creating BCD from scratch with BCDedit.exe and add “Repair my computer” WinRE Recovery Environment

(出處)
My Boot Configuration Data (BCD Store) for my Windows 7 got hosed and I had to delete it and boot off a Windows DVD, hit Shift + F10 to get at a command prompt, delete my old BCD and run Bootrec.exe /rebuildBCD to even be able to boot my system. But RebuildBCD left the file with the bare minimum necessary to boot, nearly blank, and I lost the option to run “Repair My Computer” from the F8 screen. I found a useful website: http://forum.acronis.com/forum/6758 that helped me get back on the right track, but I had to dabble around myself to get all the settings that Windows 7 Installation would normally handle. Follow these instructions to restore your BCD file so that you can run “Repair” off the hard drive instead of digging around for a DVD. “bcdedit /enum all” lists your BCD config and “bcdedit /enum all /v” lists all GUIDs instead of friendlynames. the GUID’s I have listed ARE different (make sure you check the 8th digit). Before you begin you might want to do “bcdedit /export C:\before.BCD”.

1. Create necessary optional entries
bcdedit /create {globalsettings}
bcdedit /create {bootloadersettings}
bcdedit /create {resumeloadersettings}
bcdedit /create {emssettings}
bcdedit /create {dbgsettings}
bcdedit /create {hypervisorsettings}
bcdedit /create {badmemory}
bcdedit /create {memdiag}

2. Establish proper settings for these optional entries
bcdedit /set {bootmgr} INHERIT {globalsettings}
bcdedit /set {current} INHERIT {bootloadersettings}
bcdedit /set {globalsettings} INHERIT {dbgsettings} {emssettings} {badmemory}
bcdedit /set {bootloadersettings} INHERIT {globalsettings} {hypervisorsettings}
bcdedit /set {resumeloadersettings} INHERIT {globalsettings}
bcdedit /set {emssettings} bootems YES
bcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200
bcdedit /hypervisorsettings SERIAL DEBUGPORT:1 BAUDRATE:115200
bcdedit /toolsdisplayorder {memdiag}

bcdedit /set {memdiag} description “Windows Memory Diagnostic”
bcdedit /set {memdiag} device partition=\Device\HarddiskVolume1
bcdedit /set {memdiag} path \boot\memtest.exe
bcdedit /set {memdiag} locale en-US
bcdedit /set {memdiag} inherit {globalsettings}
bcdedit /set {memdiag} badmemoryaccess Yes

3. Link “Windows Boot Manager” and primary “Windows Boot Loader” to your existing “Resume from Hibernate” identifier (replace the GUID)
bcdedit /set {bootmgr} resumeobject {8de128fe-03a5-11e1-a7d3-a215a48a5459}
bcdedit /set {current} resumeobject {8de128fe-03a5-11e1-a7d3-a215a48a5459}

4. Create loader entry for the “Recovery”(Repair My Computer)
Check C:\Recovery\ (gain access by adding “Users” READ permission)
Copy & Use that GUID here for device and osdevice – in my case 8de128ff-………… omitting the curly braces { } after [C:]\Recovery
On Line 2 and Line 3, for device and OSdevice, the final GUID after \Winre.wim doesnt exist yet (if you look carefully the 8th digit is changed – and will now have to be created ….
after \Winre.wim, create a NEW UNUSED GUID (change the 8th digit) – it will be used in step 6.

bcdedit /create {8de128ff-03a5-11e1-a7d3-a215a48a5459} /application osloader
bcdedit /set {8de128ff-03a5-11e1-a7d3-a215a48a5459} device ramdisk=[C:]\Recovery\8de128ff-03a5-11e1-a7d3-a215a48a5459\Winre.wim,{8de128f5-03a5-11e1-a7d3-a215a48a5459}
bcdedit /set {8de128ff-03a5-11e1-a7d3-a215a48a5459} osdevice ramdisk=[C:]\Recovery\8de128ff-03a5-11e1-a7d3-a215a48a5459\Winre.wim,{8de128f5-03a5-11e1-a7d3-a215a48a5459}
bcdedit /set {8de128ff-03a5-11e1-a7d3-a215a48a5459} path \windows\system32\winload.exe
bcdedit /set {8de128ff-03a5-11e1-a7d3-a215a48a5459} description “Windows Recovery Environment WinRE”
bcdedit /set {8de128ff-03a5-11e1-a7d3-a215a48a5459} inherit {bootloadersettings}
bcdedit /set {8de128ff-03a5-11e1-a7d3-a215a48a5459} systemroot \windows
bcdedit /set {8de128ff-03a5-11e1-a7d3-a215a48a5459} nx OptIn
bcdedit /set {8de128ff-03a5-11e1-a7d3-a215a48a5459} winpe yes

5. Enable the {current} OS to allow the Recovery Sequence you just created
bcdedit /set {current} recoverysequence {8de128ff-03a5-11e1-a7d3-a215a48a5459}
bcdedit /set {current} recoveryenabled Yes

6. With that NEW UNUSED GUID you just created in step 4, create the “Ramdisk Options” entry for the Recovery Sequence
On Line 4, after \Recovery\ – use the GUID you found in C:\Recovery\ -again Omit the Curly braces { }
bcdedit /create {8de128f5-03a5-11e1-a7d3-a215a48a5459} /device
bcdedit /set {8de128f5-03a5-11e1-a7d3-a215a48a5459} description “Ramdisk Options”
bcdedit /set {8de128f5-03a5-11e1-a7d3-a215a48a5459} ramdisksdidevice partition=C:
bcdedit /set {8de128f5-03a5-11e1-a7d3-a215a48a5459} ramdisksdipath \Recovery\8de128ff-03a5-11e1-a7d3-a215a48a5459\boot.sdi

Now you are done, and might want to export again to not lose your work, “bcdedit /export C:\AFTER.BCD”

常見用途:

bcdedit /enum all 列出存放區中的所有項目
bcdedit /store S:\EFI\Microsoft\Boot\BCD /enum all 列出(S:\EFI\Microsoft\Boot\BCD)存放區中的所有項目

更多延伸閱讀

修改 BCD 存放區範本
Walkthrough: Boot Windows PE from a UEFI-based Hard Disk

2017/01/15

新垣結衣,這幾年日劇演出也太精彩了,根本是收視保證!

最近剛追劇看完2016秋季劇月薪嬌妻(另譯:逃避雖然可恥但有用),終於又領略這個廣大鄉民的女友的新垣結衣魅力,這部戲就是拍給宅男工程師的勵志片吧,不過這個在現實生活中幾乎不可能發生,怎麼可能有個這麼正的妹一天到晚暗戀你然後對一個宅男展開追求!

但先撇除掉劇情不講,新垣結衣在這片日劇裡面也太萌了,雖然28歲但是依舊輕鬆駕馭25歲的腳色,不過她身高真的滿高的耶,後來查了一下資料新垣結衣從剛出道166公分持續長高,目前應該有170公分吧!

看來可以把之前他的作品都拿出來看看, 因為我也好久一陣子沒看日劇, 上次瘋狂追劇應該是2004~2005左右, 大四快畢業準備研究所的時候, 看日劇很舒壓, 有”世界中心呼喊愛情”, “H2”, “午餐女王”…等等, 算一算時間竟然也10年前了..當時還必須要先透過BT下載, 每週每週等待豬豬日劇字幕組的更新release…充滿回憶的一段時間! 現在看到新垣結衣的月薪嬌妻好像勾起塵封已久的日劇魂, 許多回憶湧上心頭~

和新垣結衣一起購物!
這段影片裏面有提到剛出道2001到2004到2007然後到現在2016的心路轉折,還有私下的新垣結衣

新垣結衣 歷年出演作品

人氣女星新垣結衣1988年6月11日出生於沖繩縣那霸市,治愈的笑容,清純可愛氣質,讓人過目難忘。從最初的些許青澀,到後來的萌屬性及逗比屬性全開,這中間的過程新垣結衣收獲了穩定的高人氣。

2005年07月《龍櫻(東大特訓班)》 飾演香阪佳乃

本劇根據日本著名漫畫《龍櫻》改編,講述的是一個暴走律師使偏差只有36的落後的高中學生們,順利考入東京大學的感人故事,故事的取景是龍山高中。現在回想起來,當時由阿部寬、山下智久、長澤雅美、中尾明慶、小池徹平、新垣結衣、沙耶子等組成的陣容實在是豪華,劇情也非常熱血。就是讓人疑惑,新垣結衣當年出演的小太妹,皮膚有點黑。

截圖看起來是因為這個角色香阪佳乃,是個畫109辣妹裝的小太妹,所以新垣結衣要把自己上古銅色的粉底,不然看隔年2006的第一本寫真書就知道根本是白肉底!可能剛滿17歲比較年輕還有點嬰兒肥, 而且這個角色本來就是設定為臭臉小太妹…

新垣結衣2001年代替姊姊參加《nicola》模特兒比賽,獲得最優秀獎。2005年演出《龍櫻》而受到關注。2006年出版第一本寫真集《水漾青春》。2007年從日出高等學校畢業後專注於演藝圈發展。

2005年10月 女之一代記 第2夜 出演:越路吹雪(少女時代)

2006年01月 真愛 = トゥルーラブTrue Love 主演:麻生菜摘

2006年01月 她的情書 = 彼女の恋文 主演:川村紫

2006年04月 辣妹掌門人 = ギャルサーGAL CIRCLE 出演:ナギサ(18)(坂下渚(Nagisa))

2006年07月《MyBoss MyHero》 飾演梅村光

長瀨智也主演的這部日劇,笑料十足,講述年輕的黑社會老大柛真喜男隱瞞自己的身份成為高中生,在高中生活中成長的校園青春喜劇。新垣結衣飾演的同班同學,是天真爛漫、溫柔且懂事的乖乖女,在班上很受歡迎,真喜男的女神。

2007年07月《父女七日變(父女變變變)》 飾演川原小梅
本屆根據日本同名暢銷書改編,共七集,講述在一次事故中,47歲的父親(館博飾)與16歲的女兒來了個靈魂互換,然後兩人以對方的思維方式繼續生活在現實中。而此前關系一直很冷淡的父女兩人,也因為這次事故開始交流,開始逐漸理解對方,以輕松、溫馨的風格贏得了固定的收視群。

2007-08-18 電影:戀愛室內佈置 主演:ユイ(青木結)

2007-09-08 電影:暴走少年 = ワルボロ 出演:山田規久子

2007-11-03 電影:《戀空》 飾演田原美嘉
電影《戀空》是由手機小說改編而成,由今井夏木導演,新垣結衣、三浦春馬主演的一部主要講述關於友情、親情、愛情的純愛電影。電影情節大家想必已經非常熟悉,就是現在回想起來,是不是會覺得三浦春馬的造型有點非主流,故事情節太俗套了呢。不過,那種純愛的感覺還是很美的。

⑤《Code Blue》系列飾演白石惠
本劇是由山下智久、新垣結衣、戶田惠梨香等為主角的電視劇,以急救中心作為舞台,描繪年輕的飛行醫生候補生和指導醫生們的互動關系,和在直升機裡參與的人們的奮斗和糾紛。新垣結衣出演的白石惠,作為醫生有於生俱來的天分,但與世無爭,常常都處於被動狀態。不想失敗,也不想讓人看見自己做得難看的樣子,常常在關鍵的時候退縮,也可以說是當今年輕人的典型。不過,漸漸自然受到身邊眾多的專業人士影響,特別是那位推開身邊一切,走自己人生道路的藍澤。看著他的身影,她開始認真考慮自己作為醫生的責任,和自己作為一個人所盼望的生活態度。

⑥《微笑(Smile)》(2009年)飾演三島花
這是一部以人類之間的愛為主題的電視劇。松本潤所飾演的男主角早川維托是菲律賓人與日本人的混血兒,雖然有著十分復雜的成長史,但卻一直都十分地陽光活潑,臉上永遠掛著讓人難忘的笑容。由新垣結衣所飾演的女主角三島花,則是一個因事故而得了失聲症然而卻也始終以一副陽光般笑容示人的純潔少女。中井貴一則飾演了一位有著誇張笑容的喜歡顯擺的律師事務所所長伊東一馬。早川維托、三島花以及伊東一馬,在三個人的笑容背後隱藏著的秘密與充滿傷痕的過去最終將這三個人連在了一起。本劇講述這三個人的相見,相愛以及反抗,由此與命運做抗爭並在社會上引發了不小的轟動。

⑦《花水木》新垣結衣22歲(2010年)飾演平澤紗枝
是由新垣結衣搭檔生田斗真出演的一部純愛電影。影片靈感源自一青窈的同名歌,這部影片在北海道以及美國紐約、加拿大等地拍攝。影片講述一對男女經歷了邂逅、別離、挫折、重逢,編織出跨越十載的美麗戀曲。
線上看: 點我

⑧《全開女孩》(2011年)飾演川若葉
2011年夏季檔月九日劇,由初次主演月九的新垣結衣主演,她負責飾演的新人女律師川若葉,受到了來自於所長的委托,要求幫忙照顧她5歲的女兒。川若葉為了照顧好所長的女兒,無奈之下來到了一家托兒所,在那裡,她遇到了無學歷、無財產、無將來的“三無”男人山田草太(錦戶亮飾),各自為了照顧孩子而感到苦惱的兩個人,在不斷地經歷著各自矛盾的過程當中,逐漸地對彼此產生了愛意。

⑨《飛翔公關室》(2013年)飾演稻葉裡佳
本劇講述在帝都電視台工作的稻葉裡佳(新垣結衣 飾)曾被認為是有前途新人,但因為工作態度過於強硬,采訪時引發不少爭執,被投閒置散成為非黃金時段的導演。因被命令做制服特集,前往自衛隊幕僚參謀部公關室進行采訪,遇上曾是戰斗機飛行員的空井大佑(綾野剛飾),故事由此展開……

⑩《Legal High》系列飾演 黛真知子
本劇將原本嚴肅的法律題材搭配上搞笑誇張的漫畫風格,獲得觀眾好評,贏得東京日劇大賞連續劇部門優秀賞等多項大獎,堺雅人、新垣結衣等演員的表演也都可圈可點。新垣結衣飾演的黛真知子,綽號“晨間劇女主角”,視鋤強扶弱為使命,超強正義感,堅持信念絕不妥協,拼命讀書通過司法考試的熱血新人律師。古美門和黛真知子信念相悖,事事針鋒相對,兩人的對手戲非常有趣。

臉大胸小又懶,新垣結衣為什麼還可以這麼火?
https://kknews.cc/zh-tw/entertainment/p8vonz.html
想要把我失落的10年2006~2016補起來,因為這10年都沒有好好停下腳步看看日劇,雖說一來沒有好的演員吸引我,都只有看當下超紅的日劇,如2006交響情人夢,2011家政婦女王,2013半澤直樹,陪老婆待產看2014派遣女醫2009深夜食堂,偶爾在電視上看到的2016房仲女王。

而且2005的我真的看了滿多日劇,後來可能真的變忙碌了,開始上研究所然後開始上班,然後結婚養小孩…加上我自己內心覺得日劇都滿老掉牙的說教模式,所以這10年都沒有一個很強的原因讓我追劇,直到新桓結衣的月薪嬌妻,不論劇情拍攝手法與運鏡方式都跟以前不同!

2017/01 開始追劇

  • 月薪嬌妻
  • 王牌大律師
  • 龍櫻(東大特訓班)…
    • 這是2005年7月在日本播出,我當年的1月還有每週追劇H2,哇!有種接續上當年的進度的感覺,感覺好充實呀!
  • 父女七日變
  • 戀空 電影線上看 20170218
  • 求婚大作戰 / 長澤雅美 山下智久

    2017/01/06

    Windows平台 - BAT批次次指令: SET 的功能介紹

    ‧SET :顯示、設定或移除 cmd.exe 環境變數。

    ‧指令詳解:

    SET [variable=[string]]      variable  指定環境變數名稱。      string    指定設定給變數的一系列字元。

    僅輸入 SET 而不加上任何參數,可以顯示目前的環境變數。

    如果您啟動了擴充指令,SET 指令有以下的改變:

    如果執列 SET 指令而且只推演變數名稱,沒有等號或數值的話,指令會顯示出全部字首符合 SET 指令中指定變數名稱的全部變數值。
    例如:

        SET P

    會列出全部以 ‘P’ 為開頭的環境變數。
    如果在目前的環境中找不至變數名稱,SET 指令會將 ERRORLEVEL設為 1。
    SET 指令不將等號 (=) 視為變數名稱的一部份。

    有兩個新參數已經加至 SET 指令中:

        SET /A expression    SET /P variable=[promptString]

    /A 指定在等號右方的字字串是一個要被自變數的數位自變數式。
    您可以用運算式進列簡單的自變數,而且支援下列的自變數子
    (依照自變數優先(順序)順序由高至低佇列):

    () – 組成一群
    ! ~ – – 單元運算子
    * / % – 數位自變數元
    + – – 數位自變數元
    << >> – 邏輯位移
    & – 位元自變數 and
    ^ – 位元自變數 exclusive or
    | – 位元自變數 or
    = *= /= %= += -= – 指定
    &= ^= |= <<= >>=
    , – 自變數式分隔字元

    如果您使用了任何邏輯或餘數自變數子,您必須將自變數式兩邊括上引號。
    任何在自變數式中非數位的字字串會被當作環境變數,並且在使用前會先將這些環境變數交換為數位。

    如果您所指定的環境變數名稱尚未在目前環境中定義,那麼他的值會被設為 0。
    這可以讓您用環境變數值來做自變數,而不必打入全部的 % 符號來找取得他的值。

    如果 SET /A 是用指令檔之外的指令列執列,他會顯示自變數式最後的數值。
    指定自變數子需要有個環境變數在等號的左方。

    不同進位數:
    0x 字首在數位前方代表格十六進位數位、0b 字首代表格二進位數位或 0 字首代表格八進位數位,否則數位值都是指十進位數位。
    所以 0x12 就和 18、022 等相同。
    請注意八進位數位可能容易弄錯: 像 08 和 09 就不是正確的數位,因為 8 和 9 並不是八進位的正確數位。

    /P 參數讓您設定指令列的使用者輸入變數值。
    在讀入找取輸入指令列之前,顯示指定的 promptString。
    promptString 可以是空白。

    環境變數找取代功能已經有下列增強:

    %PATH:str1=str2%
    會將 PATH 環境變數展開,找取代每個發現的 “str1” 與 “str2″的擴充結果。
    “str2” 可以是空白字字串,這會從擴充扇出中移除全部 “str1″。
    “str1” 可以用星狀圖形開始,這將會從擴充扇出的開頭開始,對應至從全部第一個發現含有str1 的項目。

    您也可以為擴充功能指定子字字串。

        %PATH:~10,5%

    這將會擴充 PATH 環境變數,然後只使用擴充結果的第 11 個(位移 10)字元後的 5 個字元如果長度未指定,將會預設為上次使用的變數值。
    如果數位(位移或長度)是負數,使用的數位將會是環境變數的長度加上位移或指定長度。

        %PATH:~-10%

    將抽出 PATH 變數的最後 10 個字元。

        %PATH:~0,-2%

    將抽出 PATH 變數的最後 2 個字元。

    最後,系統加入了延遲環境變數展開的支援。

    在預設狀態下,指令展開會啟用這項目支援,但是您可以在 CMD.EXE 用 /V 指令列參數來啟動/停用這個功能。
    請參看 CMD /?

    延遲環境變數展開功能可用來避開展開功能限制。
    這項目限制是發生在指令列讀入找取程序,不是發生在執列程序。
    下面的範例說明了立即展開變數時會發生的問題:

        set VAR=before    if "%VAR%" == "before" (        set VAR=after;        if "%VAR%" == "after" @echo If you see this, it worked    )

    這個例子永遠無法顯示 echo 訊息,因為在兩個 IF 敘述中的 %VAR% 會在第一個 IF 敘述被讀入入時便被展開。
    這是因為他是邏輯上推演了 IF 的內部,而內部又是一個複合敘述。
    所以在複合敘述內的 IF 實際上是用”before” 和 “after” 來比較,而這永遠不會為真。
    同樣的,下面的例子也不會作用:

        set LIST=    for %i in (*) do set LIST=%LIST% %i    echo %LIST%

    這個例子中並不會建立目前目錄中全部檔案的清單,相反的只會將 LIST 變數設為最後一個找至的檔案。
    同樣地,這是因為 %LIST% 只有在 FOR 敘述第一次被讀入入時才展開,此時 LIST 變數是空的。
    所以我們實際執列的 FOR迴圈是:

        for %i in (*) do set LIST= %i

    這只是重複的將 LIST 設為最後找至的檔案。

    延遲環境變數展開讓您可以用一個不同的字元 (驚嘆號) 在執列時展開環境變數。
    如果啟動了延遲環境變數展開,上面的例子可以被改寫下列而正常作用:

        set VAR=before    if "%VAR%" == "before" (        set VAR=after        if "!VAR!" == "after" @echo If you see this, it worked    )    set LIST=    for %i in (*) do set LIST=!LIST! %i    echo %LIST%

    如果您啟動了指令擴充,有幾個動態環境變數會被展開但是不會出現在 SET所顯示的環境變數清單中。
    這些變數的值會每次在這些變數被展開時動態地重新計算如果使用者用這些變數的名稱來定義變數時,
    則這個新定義會疊層以下所列的動態變數:

    %CD% – 展開為含目前目錄的字字串。
    %DATE% – 展開為與 DATE 指令格式相同的目前日期字字串。
    %TIME% – 展開為與 TIME 指令格式相同的目前時間字字串。
    %RANDOM% – 展開為一個在 0 和 32767 之間的整數亂數值。
    %ERRORLEVEL% – 展開為目前的 ERRORLEVEL 值
    %CMDEXTVERSION% – 展開為目前的指令處理擴充功能的版本號碼。
    %CMDCMDLINE% – 展開為執列指令處理器前的原始指令列。

    2016/12/30

    理財筆記- 如何選股, 以及股票的買進與賣出時機

    散戶投資股票之優勢為選股與時間, 由於我們的資本少少因此更許要慎選標的物, 根據每個人自己能夠接受的常現或短線作決定, 但我個人建議要走長線才會提高勝率, 不然只是在賭博!

    選股SOP

    1. 是否這間公司(股票)你打算存股10年?
      • 巴菲特曾說過:「如果你不願意擁有一支股票10年,那就不要考慮擁有它10分鐘。」
      • 巴菲特還說:「我最喜歡持有一支股票的時間是永遠。」
    2. 是否這間公司(股票) 每年的配股配息是穩定的 ? 殖利率至少要3%以上, 或者它有好的股東報酬率(ROE) ? 至少要8%以上
    3. 是否這家公司的收益模式是穩定的? 客戶願意常常消費, 或著有跟客戶簽長約
    4. 本益比低於15%,
    5. 是否為該產業的前兩名? 而且是寡占市場?
    6. 買進該股票的時候就要考慮是存股, 還是賺波段?

     

    買進

    1. 存股型股票, 等波段回檔時買入。若持續沒回檔,可以考慮其他行業回檔的股票,讓投資產業組合多樣化
    2. 好公司被錯殺, 股價被低估
    3. 觀察還原股價技術線圖, 若是股價回檔到一定程度可以考慮買進, 前提是這家公司的還原股價長線是持續上升

    賣出

    1. 本質變壞, 連兩季出現虧損
    2. 該產業逐漸失去護城河, 這塊市場轉向新的商業模式

    2016/12/27

    IDE, AHCI, RAID硬碟模式

    硬碟通常提供 3 種模式︰IDE、AHCI 和 RAID。
    AHCI 和 RAID需要安裝相對應的驅動程式。
    否則此硬碟機可能無法被偵測。

    1. IDE : 一般硬碟模式,不可熱插拔
    2. AHCI : SATA模式,可熱插拔和可啟動NCQ (必須SATA硬碟)
      • AHCI(進階主機控制器介面)是一種由英特爾制定的技術標準。AHCI需在 BIOS 中啟用
      • AHCI 模式具有 3 大優勢︰
        • 支援 NCQ(原生指令排序),從而使 SATA 硬碟機一次能夠接受一個以上的指令並能以動態的方式對指令進行重新排序以獲得最大效率。
        • 支援裝置熱插拔功能。
        • 在開機時,支援多個硬碟機的交錯加速。
      • *如果您是使用IDE模式來安裝Windows,之後再從BIOS裡將設定變更為AHCI模式然後重新開機,可能導致系統出現藍底白字且無法進入Windows。
      • 如果您希望啟用AHCI,建議您重新安裝Windows,並且於安裝過程載入AHCI驅動程式。
    3. RAID : 一般需要兩個以上的硬碟,將多個硬碟組合成為一個硬碟以提高硬碟效率。
      • 根據不同的 RAID 模式就有不同的功能。
        • 例如 RAID-0 將兩顆硬碟組合起來提高讀寫速度,比較風險。如其中一顆硬碟出問題,整個RAID-0 資料就全滅。
        • RAID-1 組合起來成為鏡像備份,比較安全,但沒有提高讀寫速度。
        • 也有類似 RAID-0+1 模式,同時具備 RAID-0 和 RAID-1 的模式,但最低限度需要 4 顆硬碟。