pretty code

顯示具有 Win10 標籤的文章。 顯示所有文章
顯示具有 Win10 標籤的文章。 顯示所有文章

2024年8月16日 星期五

Windows 10 2019 LTSC 不要安裝 KB5041578

前天 8/14 (三) 上午安裝了 3 個 Windows 更新,沒想到重開機後登入就開始發生異常!一開始只看到滑鼠游標,等很久後才看到桌面,任何操作都要等上 20 ~ 40 分鐘不等。

詳細狀況如下:


好不容易在 8/14 (三) 快 6 點時,順利按下舊程式與功能裡的移除更新的對話框,剛好我選的就是 KB5041578,移除後一切正常。

沒想到今天 8/16 (五) 快中午時,又被 ivanti 軟體自動安裝相關更新(我到現在才知道這套軟體有這功能,原本以為只是資產管理軟體之類的),不知情的我在看到 ivanti 軟體重開機提示訊息後又再一次的中獎了!

有了前一次的經驗,一樣慢慢地嘗試去移除該更新,結果卡在執行進度 15% 中,還好後來 IT 來了之後,重開機時發現其實有順利移除,但 IT 多移除了某個更新,我的電腦應該只要移除 KB5041578 即可。

從事件檢視器可以看出,我昨天一整天都正常。


後來聽我新部門強者同事說,他都不管 ivanti 軟體的更新通知,完全不去動它,我才知道還有這招可以使用XD

正常來說,Windows 更新應該要等過一陣子才推送,不過這算重大安全性更新,可能有其他資安政策考量吧?

8/15 (四) 查詢時只看到一篇 reddit 文章討論,看起來也不是什麼重大問題?


剛 google 後,終於有人發表中獎文章了。


這次中獎最大的收穫是知道安全模式不再是開機按下 F8,而是在開機選單中同時按下 Shift 後重開機。

坦白說這是很蠢的設計,如果連開機都有問題,除了安裝光碟外哪有機會進安全模式?

這也是我一直不喜歡微軟的原因。

2024/08/16 晚上更新

我想這篇文章的解決方式應該是正解,我前天確實在能看到工作管理員的情況下,會看到 Cryptographic Services" 一直在讀寫。


2024/08/17 更新

看起來這個網站會討論更新是否有問題,前天就是沒有再繼續追蹤,導致昨天再一次中獎!

查了一下之前自己買的 SSD 是 2019/10 購買,被這個不斷讀寫 bug 也不知會不會搞出內傷?於是勇敢的掏出魔法小卡再買一顆 SSD 為將來的重灌作準備XD

也不知道這個工作會再待多久?花點小錢增加工作效率還是很值得的。

2024/08/19 更新

快下班前檢查了一下,SSD 健康程度 89%,累計寫入 12TB,總使用時數 50XX 小時,查了一下我 5 年前購買的 Crucial MX500 500GB TBW 為 180TB。

對比我家裡購買一年的筆電 SSD,我的累計寫入居然有 4TB,不知是不是被微軟該死的 BitLocker 或是 vcpkg 安裝各個軟體套件的頻繁讀寫有關?


馬上 Disable BitLocker 功能,靠,為了解密又被累積寫入了 400GB,溫度也上升了 6 度左右。順帶一提,我的 C 槽使用量為 334 GB。


另外我強者同事說的沒錯,ivanti 的提醒視窗可以不用理它,應該不會幫你重開機,但是需把視窗移至角落,但大概一個小時內又會被置中提醒重開機。

不得不說,ivanti 真的很爛繼之前不斷發 arp 封包打掛我的 UEFI 測試外,事件檢視器系統裡有一個 "CISMBIOS Warning event ID  54" 事件居然也是 ivanti 引起的,每天都有快 10 個 Warning,當我們有需要檢查事件檢視器時,真的會影響我們查找事件的工作效率。


2024/08/29 更新

為了等待一個未完的工作,一直不敢抱電腦去重灌,而這個星期居然有其他不是我作業系統版本的同事被 IT 電話通知要更新系統。

早上終於輪到我被 email 通知了,跟 IT 約好明天更新,由於會有一些時間不能使用電腦,乾脆請特休好了,順便可以去處理一些私人事情。

不過 IT 說可以原機升級,除非特殊狀況才要整個重灌,於是趁著快中午前安裝 5 年前購買的 Renee Becca 將舊 SSD 資料複製到新 SSD。

這次不同上次,可能是電腦還在使用的關係,進度不快,還好吃飯時可能因為休眠,故進度有加快,回來時就已經複製完畢。

忘記上次將新 SSD 接回電腦後開機是否需要掃描修復?我才不到 180 的實際使用空間居然花了一個小時半才搞定?幸好掃描完開機還是無痛的轉移完畢。

2021年9月2日 星期四

凍結的 Windows 10 console 視窗

最近的案子在測試時大概會自動開啟 4 個視窗,偶爾會有某個 console 視窗的程式突然停止運作,一直到按下 Enter 鍵後才會看到程式繼續執行並吐出結果。

因為機率非常的小,故我也不以為意,直到前幾天同事在測試我的新 API 時,他無意間提到他也會遇到跟我一樣的問題,最後他發現是 console 視窗進入了選取模式而導致。

真是個有趣的發現,今天中午試著用關鍵字 "Windows 10 console freeze" 來搜尋,果然看到以前就有人發問過這個問題了。簡單來說,這是 Windows 10 console 視窗的功能,它很貼心(?)的在你選取視窗時,認為你可能要做一些編輯動作,為了怕你不好選取文字,便停住了正在運行中的程式。

詳情可以看這裡

2021年6月24日 星期四

Hide/Show Desktop Icons on Windows 10 by C code

雖然我們在桌面按下滑鼠右鍵,就可以在檢視功能的子選單中選擇是否要顯示桌面圖示,但需使用滑鼠又要兩個操作步驟感覺就很不好用。

昨天晚上終於狠下心來把它完成,雖然我之前已經 Google 過了,但肩膀受傷後人就變得很懶,除了工作以外的程式都很懶得動工,這個星期老婆進公司上班故不用張羅三餐,我連自己的午餐都隨便吃,可能是偷懶的緣故,感覺這星期肩膀狀況還不錯,所以昨天才會想來做這件事。

好久沒寫 Windows 相關的程式了,很多 HWND 等的參數都變得很陌生。

一開始在沒 Google 前,直覺就是可能跟 registry 有關,也找到相關的 registry。

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"HideIcons"=dword:00000001

原本以為只要修改這個值後,再想辦法用廣播方式送出 WM_SETTINGCHANGE 訊息,應該就可以生效,但據我實驗的結果,桌面程式知道我動了 registry,但並不會生效,我猜它應該只是讀 registry 得知目前的值,才決定是否要在 "顯示桌面圖示" 前打勾。

好吧,只好走 Google 來的方式,來解決這個問題。


要特別注意的一點,上面有說應該要看 OS 版本來決定對誰發送訊息,但我在寫 Code 前有先用 Spy 這類的軟體來找尋視窗,發現在 Windows 10 跟連結的說法不太一樣。

順序應該是如下:

01. 找到 Progman 這個 Window。
02. 找到 class 為 "SHELLDLL_DefView" 的視窗。
03. 送出 WM_COMMAND 訊息。


int toggleIconByShell() {
    int res = 0;

    HWND progman;
    HWND defView;

    // Find SHELLDLL_DefView class
    progman = FindWindowExA(NULL, NULL, "Progman", "Program Manager");
    printf("Program is 0x%p\n", progman);

    defView = FindWindowExA(progman, NULL, "SHELLDLL_DefView", "");
    printf("SHELLDLL_DefView is 0x%p\n", defView);


    // Send message to defView
    int lParam = 0;
    int wParam = 0x7402;

    LSTATUS lResult = SendMessage(defView, WM_COMMAND, wParam, lParam);

    if (lResult != ERROR_SUCCESS) {
        printErrorCode(lResult);
        res = lResult;
    }

    printf("OK\n");
    return res;
}

2021/06/24 更新

又把文章仔細看了一遍,SHELLDLL_DefView 在某些情況下,會從原本的 Progman 跑到 WorkerW 下面,故需要針對不同情況去找 Handle,將尋找 Handle 獨立出來變成函數,增加可讀性。


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void printErrorCode(LSTATUS lResult)
{
    printf("ErrorCode = %d(0x%08X) \n", (int)lResult, (int)lResult);
}

BOOL EnumCallback(HWND hwnd, LPARAM lParam)
{
    char name[256];
    memset(name, 0x00, sizeof(name));

    GetClassNameA(hwnd, name, sizeof(name));

    if (strcmp(name, "WorkerW") == 0) {
        HWND *address = (HWND*)lParam;

        HWND defView = FindWindowExA(hwnd, NULL, "SHELLDLL_DefView", "");

        if (defView != NULL) {
            *address = defView;
            return FALSE;
        }
    }
    return TRUE;
}

HWND getDefViewHandle()
{
    HWND progman;
    HWND defView;

    // Find SHELLDLL_DefView class
    progman = FindWindowExA(NULL, NULL, "Progman", "Program Manager");
    printf("Program is 0x%p\n", progman);

    defView = FindWindowExA(progman, NULL, "SHELLDLL_DefView", "");
    printf("SHELLDLL_DefView is 0x%p\n", defView);

    if (defView == NULL) {
        HWND *address = &defView;
        // defView is moved to "WorkerW"
        EnumWindows(EnumCallback, (LPARAM)address);
        printf("After searching WorkerW, SHELLDLL_DefView is 0x%p\n", *address);
        defView = *address;

        // SHELLDLL_DefView is not the child of WorkerW.
        if (defView == NULL) {
            HWND desktop = GetShellWindow();
            defView = FindWindowExA(desktop, NULL, "SHELLDLL_DefView", "");
            printf("After searching desktop, SHELLDLL_DefView is 0x%p\n", defView);
        }
    }

    return defView;
}

int toggleIconByShell()
{
    int res = 0;

    HWND defView = getDefViewHandle();

    if (defView == NULL) {
        printf("SHELLDLL_DefView not found \n");
        return -1;
    }

    // Send message to defView
    int lParam = 0;
    int wParam = 0x7402;

    LSTATUS lResult = SendMessage(defView, WM_COMMAND, wParam, lParam);

    if (lResult != ERROR_SUCCESS) {
        printErrorCode(lResult);
        res = lResult;
    }

    printf("OK\n");
    return res;
}

int main(void) {
    toggleIconByShell();

    system("pause");
    return 0;
}

2021/06/25 更新

在已經知道訣竅的情況下,抓取訊息就變得很簡單,但當初怎樣找到標的物和要送的訊息,我想這才是最困難的部份吧。

2020年4月6日 星期一

Event ID 12 on Windows 10

大概是 3 月下旬左右,之前寫的計算下班時間的程式都無法正常工作!後來去事件檢視器確認了一下,都看不到 Event ID 12 的事件,這件事確實有點奇怪?我的電腦升級 Windows 10 是在 2 月底左右,不可能到 3 月底才不正常。

想了一下,會不會是電源相關設定在 Windows 10 不是正常關機導致?

後來在控制台->電源選項->系統設定->關機設定->開啟快速啟動,將快速啟動停用後,Event ID 12 就恢復正常,繼續觀察中。

2020年2月27日 星期四

淺綠色背景 on Windows 10

以前 XP, Win7 時代,都習慣把預設軟體背景透過顯示設定設成淺綠色,長期看下來眼睛比較舒服。

Windows 10 已經沒有這個選項,不過可以透過 regedit,調整下面值並重新登入即可。

[HKEY_CURRENT_USER\Control Panel\Colors]
"Window"="199 237 204"

Office, Notepad 看起來都有生效。