mieki256's diary



2024/01/11(木) [n年前の日記]

#1 [prog] C言語で宇宙飛行スクリーンセーバっぽい描画をするプログラムを書いてみた

_先日、 Python + PyOpenGL を使って、宇宙飛行スクリーンセーバ(ssstars.scr)っぽい描画をするスクリプトを書いたのだけど。ソレを、C言語 + OpenGL (+ freeglut) 用に移植してみた。

環境は、Windows10 x64 22H2 + MinGW (gcc 6.3.0) or MSYS2 MINGW64 (gcc 13.2.0) + freeglut 3.0.0 or 3.4.0-2。

ソースその他 :

ソースが長くなってしまったので、gist に置いておく。

_Like ssstars screensaver for C and OpenGL

一応ココにも置いておくけど…。

_01_ssstars_opengl.c
_Makefile.txt
_texture.h
_texture.png

stbライブラリ(stb_image.h) を使ってpngを読み込んでいるので、ビルドには stb_image.h も必要。入手して、.c と同じ階層に置く。

_stb/stb_image.h at master - nothings/stb
_nothings/stb: stb single-file public domain libraries for C/C++

ビルド :

Makefile も用意したので、MinGW (gcc 6.3.0) が使える状態で make と打てば、01_ssstars_opengl.exe が生成される。

実行結果 :

01_ssstars_opengl.exe を実行すると以下のような感じの見た目になる。

今回のポイント :

今回書いたプログラムのポイントは…。
  • exeファイルの中にpng画像を含めてみた。これで、画像を描画するプログラムも、exeファイル1つを配布するだけで済む。別途、画像ファイルまで配布しなくて良い。
  • メモリ上(exeファイル内)のpng画像バイナリを読み込んで OpenGLのテクスチャとして利用している。

exeファイルにpng画像を含めるあたりは、xxd を使って、バイナリファイルをC言語のヘッダファイルの状態に変換して、#include で .c に内包してしまうことで実現してる。

_xxdというコマンドがあることを知った - mieki256's diary

安直かもしれないけれど、確実と言えば確実かなと…。ただ、バイナリのファイルサイズが大き過ぎる場合は問題が出てくるかもしれない。その場合は objcopy を使うことになるのかも。

_objcopyについて調べていた - mieki256's diary

メモリ上のpng画像バイナリを読み込むあたりは、stbライブラリ(stb_image.h)を使用。

#2 [windows] WindowsUpdateが0x80070643エラーを出したので回復パーティションサイズを増やしてみた

Windows10 x64 22H2上で、WindowsUpdate が 0x80070643 エラーを延々出し続ける状態になってしまった。

ググってみたところ、回復パーティションのサイズが足りないと、件のエラーが出るらしい…。なんじゃそりゃ…。

_Windows Update KB5034441 0x80070643 エラー - FF11どらプリを心待ちにしている、わしの倉庫
_KB5034441が0x80070643エラーで失敗するとの不具合報告が多数。Windows10にて | ニッチなPCゲーマーの環境構築Z

なんともふざけた話だなと。と言うのも、自分、去年の年末、Windows10を再インストールしていて。その際、各パーティションサイズについては、Windows10のセットアップディスクに任せて、自動でサイズを切らせていたわけで…。

しかし、デフォルトでは回復パーティションのサイズが500MB+αぐらいしかなくて、「オイオイ。そのサイズで大丈夫か?」「たしか以前、回復パーティションのサイズが足りなくて不具合を起こしていた話を目にしたぞ?」と不安になったものの、「最新のセットアップディスクが『このサイズで十分ですよ』と処理しているのだから、まあこれでも大丈夫なのかなあ」とそのままにしてしまったわけで…。

やっぱりダメじゃねえか! ふざけんな! 「このサイズで十分ですよ」ってお前コレ全然足りてないやんけ! 案の定こんなトラブル起こしやがって! ムキー!

デフォルト状態でインストールするとこうして必ず不具合を起こすことになる、この状況はマズいよなあ。どうして最初から2GBぐらい確保するように修正しておかないのかなあ。一体何をやってるんだ、Microsoft。

それはともかく。このまま放置していてもずっとエラーを出し続けて、他の WindowsUpdate が処理されない状態に陥りそうな気がする…。回復パーティションサイズを増やす方法については、公式に記事が公開されてるらしいので、一応作業してみることにした。

手順をメモ :

作業手順は、以下の英文記事で紹介されているらしい。

_KB5028997: Instructions to manually resize your partition to install the WinRE update - Microsoft Support

DeepLで翻訳しながら作業を進めていった。

何をやっているのかをざっくり説明すると、以下のようなことをしているようだなと…。
  1. WinRE(回復パーティション)を無効にする。
  2. OSが入っているパーティション(Cドライブ)のサイズを少し縮小する。
  3. 回復パーティションを削除。
  4. 回復パーティションを再作成。この時、Cドライブを縮小した分、回復パーティションのサイズが増える。
  5. 回復パーティションをフォーマット。
  6. WinREを有効化。

注意点その1。上記の流れを見れば分かるように、Cドライブのすぐ後ろに回復パーティションがあることを前提にして作業している。もし、そういうパーティション構成になってなかったら、この作業はできない。まあ、回復パーティションの直前に、サイズを縮小できそうなパーティションがあれば、どうにか作業できるだろうけど…。

注意点その2。Cドライブは空き容量がそれなりにあること。空き容量がほとんど残ってなかったり、パーティションの後ろのほうに移動できないファイル等が存在しちゃってると、パーティションサイズを縮小できない。

注意点その3。この作業は、Windows10が通常モードで動いてる状態で行う。最初、「この手の怪しい作業はセーフモードで行ったほうが安全かなあ」とセーフモードで立ち上げて作業していったら、「セーフモードでこの操作はできないぞ」と拒否られてしまった。

ということで、前述の記事を引用、かつ、DeepLの翻訳結果も載せつつ、作業結果も一応メモしておきます。あくまで自分の場合はこうなったということで…。やってみて何かあっても自己責任ってことで。

1. Open a Command Prompt window (cmd) as admin.
1. 管理者としてコマンドプロンプトウィンドウ(cmd)を開く。

デスクトップ左下の検索欄に「cmd」と打ち込めば「コマンドプロンプト」というアイコンが出てくるので、右クリックして「管理者として実行」を選択。


2. To check the WinRE status, run "reagentc /info" .
2. WinREの状態を確認するには、reagentc /info を実行してください。

If the WinRE is installed, there should be a “Windows RE location” with a path to the WinRE directory.
WinREがインストールされていれば、"Windows RE location "にWinREディレクトリへのパスがあるはずです。

An example is,
例を挙げよう、

"Windows RE location: \\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE."

Here, the number after “harddisk” and “partition” is the index of the disk and partition WinRE is on.
ここで、"harddisk "と "partition "の後の数字は、WinREがあるディスクとパーティションのインデックスである。

以下はコマンドを打った際の結果。
>reagentc /info
Windows 回復環境 (Windows RE) およびシステム リセット構成
情報:

    Windows RE の状態:         Enabled
    Windows RE の場所:         \\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE
    ブート構成データ (BCD) ID: 73d26c46-9440-11ee-beb5-82ba171add91
    回復イメージの場所:
    回復イメージ インデックス: 0
    カスタム イメージの場所:
    カスタム イメージ インデックス: 0

REAGENTC.EXE: 操作は成功しました。

たしかに、「\\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE」という場所が表示された。harddisk 0、partition 4 の位置に WinRE があるようだなと…。


3. To disable the WinRE, run "reagentc /disable"
3. WinREを無効にするには、reagentc /disable を実行します。
>reagentc /disable
REAGENTC.EXE: 操作は成功しました。

>reagentc /info
Windows 回復環境 (Windows RE) およびシステム リセット構成
情報:

    Windows RE の状態:         Disabled
    Windows RE の場所:
    ブート構成データ (BCD) ID: 00000000-0000-0000-0000-000000000000
    回復イメージの場所:
    回復イメージ インデックス: 0
    カスタム イメージの場所:
    カスタム イメージ インデックス: 0

REAGENTC.EXE: 操作は成功しました。

WinREは無効になった模様。


4. Shrink the OS partition and prepare the disk for a new recovery partition.
4. OSパーティションを縮小し、新しいリカバリーパーティション用にディスクを準備する。

a. To shrink the OS, run "diskpart"
a. OSを縮小するには、diskpart を実行します。
>diskpart

Microsoft DiskPart バージョン 10.0.19041.3636

Copyright (C) Microsoft Corporation.
コンピューター: HOGEFUGA

DISKPART>

ディスクのパーティションを操作するツール、diskpart が起動。「DISKPART>」と表示して入力待ちの状態になった。


b. Run "list disk"
b. list disk を実行する。
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           476 GB  1024 KB        *
  ディスク 1    オンライン          1863 GB  1024 KB
  ディスク 2    オンライン           238 GB      0 B

自分のPCは、SSD、HDD、SSD の3つのストレージを繋いであるので、ディスクが3つリストアップされた。


c. To select the OS disk, run "sel disk<OS disk index>"
c. OSディスクを選択するには、"sel disk<OSディスクインデックス>" を実行します。

This should be the same disk index as WinRE.
これは WinRE と同じディスクインデックスでなければならない。
DISKPART> sel disk 0

ディスク 0 が選択されました。

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
* ディスク 0    オンライン           476 GB  1024 KB        *
  ディスク 1    オンライン          1863 GB  1024 KB
  ディスク 2    オンライン           238 GB      0 B

「list disk」をしてみると、「ディスク 0」の左側に「*」が表示されている。「現在、ディスク0 が対象になってますよ」という記号なのだろう。この「*」が無かったら、一体どこのディスクを対象にして処理してるのか分からないのでちょっと怖い。


d. To check the partition under the OS disk and find the OS partition, run "list part"
d. OSディスク内のパーティションを確認し、OSパーティションを見つけるには、list part を実行します。
DISKPART> list part

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               100 MB  1024 KB
  Partition 2    予約                  16 MB   101 MB
  Partition 3    プライマリ              476 GB   117 MB
  Partition 4    回復                 564 MB   476 GB

各パーティションのサイズからして、Partition 3 がCドライブ(OSが入ってるドライブ)で、Partition 4 が回復パーティションになっている。


e. To select the OS partition, run "sel part<OS partition index>"
e. OSパーティションを選択するには、sel part<OSパーティションインデックス> を実行します。
DISKPART> sel part 3

パーティション 3 が選択されました。

DISKPART> list part

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               100 MB  1024 KB
  Partition 2    予約                  16 MB   101 MB
* Partition 3    プライマリ              476 GB   117 MB
  Partition 4    回復                 564 MB   476 GB

Cドライブを選択した。Partition 3 の左側に「*」が表示されている。「このパーティションが対象ですよ」ということだろう。


f. Run "shrink desired=250 minimum=250"
f. shrink desired=250 minimum=250 を実行する。

ここで、shrink というコマンドを使って、Cドライブのパーティションサイズを縮小する。元記事は 250MB ほどCドライブを縮小しているけれど、また似たような不具合に遭遇したら面倒臭いので、この際、回復パーティションを2GBぐらいにしてしまいたい。Cドライブを1500MBほど縮小して、その分を回復パーティションに回してやることにする。

DISKPART> shrink desired=1500 minimum=1500

ボリュームは、次の方法で正常に縮小されました: 1500 MB

SSDを対象にして処理をしたので、体感では数秒で処理が終わってくれた。HDDが対象の場合は…どのくらい時間がかかるのやら…。

余談。セーフモードでこの処理をすると、以下のように拒否られて、先に進めなくなる。Windows10を通常モードで立ち上げた状態で作業すること。
DISKPART> shrink desired=1500 minimum=1500

DiskPart にエラーが発生しました: このサービスはセーフ モードで開始できません
詳細については、システム イベント ログを参照してください。

DISKPART> exit

DiskPart を終了しています...


g. To select the WinRE partition, run "sel part<WinRE partition index>"
g. WinREパーティションを選択するには、sel part<WinREパーティションインデックス> を実行します。
DISKPART> list part

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               100 MB  1024 KB
  Partition 2    予約                  16 MB   101 MB
* Partition 3    プライマリ              474 GB   117 MB
  Partition 4    回復                 564 MB   476 GB

DISKPART> sel part 4

パーティション 4 が選択されました。

DISKPART> list part

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               100 MB  1024 KB
  Partition 2    予約                  16 MB   101 MB
  Partition 3    プライマリ              474 GB   117 MB
* Partition 4    回復                 564 MB   476 GB

回復パーティションを選択して、削除していく。回復パーティション (Partition 4) の左側に「*」が表示されている。たしかに選択しているぞ、と…。

ここで間違ってCドライブを選択したままだったりすると、Cドライブをまるっと削除することになるので注意。マジで注意。本当に注意。しっかり確認してから先に進もう。マジで。


h. To delete the WinRE partition, run "delete partition override"
h. WinREパーティションを削除するには、delete partition override を実行します。
DISKPART> delete partition override

DiskPart は選択されたパーティションを正常に削除しました。

DISKPART> list part

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               100 MB  1024 KB
  Partition 2    予約                  16 MB   101 MB
  Partition 3    プライマリ              474 GB   117 MB

回復パーティションがまるっと全て消滅した。


5. Create a new recovery partition.
5. 新しい回復パーティションを作成する。

a. First, check if the disk partition style is a GUID Partition Table (GPT) or a Master Boot Record (MBR).
a. まず、ディスクのパーティションスタイルがGUIDパーティションテーブル(GPT)かマスターブートレコード(MBR)かを確認します。

To do that, run "list disk".
そのためには、list diskを実行する。

Check if there is an asterisk character (*) in the "Gpt" column.
"Gpt"列にアスタリスク文字(*)があるかチェックする。

If there is an asterisk character (*), then the drive is GPT.
アスタリスク文字(*)がある場合、ドライブはGPTです。

Otherwise, the drive is MBR.
そうでなければ、ドライブはMBRである。
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
* ディスク 0    オンライン           476 GB  2065 MB        *
  ディスク 1    オンライン          1863 GB  1024 KB
  ディスク 2    オンライン           238 GB      0 B

表示がずれているけれど、「GPT」のあたりに「*」がついている。つまり、このディスクはGPTで管理されている。


i. If your disk is GPT,
i. ディスクが GPT の場合,

run "create partition primary id=de94bba4-06d1-4d40-a16a-bfd50179d6ac"
create partition primary id=de94bba4-06d1-4d40-a16a-bfd50179d6ac を実行して

followed by the command
というコマンドに続いて

"gpt attributes =0x8000000000000001"
DISKPART> create partition primary id=de94bba4-06d1-4d40-a16a-bfd50179d6ac

DiskPart は指定したパーティションの作成に成功しました。

DISKPART> gpt attributes =0x8000000000000001

選択された GPT パーティションに DiskPart で属性を割り当てました。

今回は GPT のディスクなので、上記のコマンドを打った。MBR の場合は別のコマンドを打つ。ちなみに、回復パーティションには、「de94bba4-06d1-4d40-a16a-bfd50179d6ac」というGUIDをセットする、という取り決めになっているらしい。何にせよ、回復パーティション用のパーティションを作成できた。


ii. If your disk is MBR, run "create partition primary id=27"
ii. ディスクがMBRの場合、create partition primary id=27 を実行する。

今回は、MBRのディスクじゃなかったので、この作業はしなかった。ディスクが MBR なら、このコマンドを打つ。らしい。


b. To format the partition, run 'format quick fs=ntfs label="Windows RE tools"'
b. パーティションをフォーマットするには、format quick fs=ntfs label="Windows RE tools" を実行します。
DISKPART> list part

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム               100 MB  1024 KB
  Partition 2    予約                  16 MB   101 MB
  Partition 3    プライマリ              474 GB   117 MB
* Partition 4    回復                2065 MB   474 GB

DISKPART> format quicks fs=ntfs label="Windows RE tools"

このコマンドに指定した引数は無効です。
このコマンド タイプの詳細については、「HELP FORMAT」と入力してください。

パーティションを作成しただけでは使えないので、フォーマットをかけるわけだけど。処理が拒否られて焦った。よくよく確認したら、quick と打つべきところを quicks と打っていた。DeepL の翻訳結果が、当初 quick を quicks に書き換えちゃっていたので…。自動翻訳はそういうことが起きたりするから気を付けないといけない。コマンドをコピペする時は、翻訳前の元記事からコピペすること。

DISKPART> FORMAT FS=NTFS LABEL="Windows RE tools" QUICK

  100% 完了しました

DiskPart は、ボリュームのフォーマットを完了しました。

回復パーティションを NTFS でフォーマットできた。


6. To confirm that the WinRE partition is created, run "list vol"
6. WinREパーティションが作成されたことを確認するには、list vol を実行します。
DISKPART> list vol

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0     R                       DVD-ROM         0 B  メディアなし
  Volume 1     C                NTFS   Partition    474 GB  正常         ブート
  Volume 2                      FAT32  Partition    100 MB  正常         システム
  Volume 4     D   DATADRV      NTFS   Partition   1863 GB  正常
  Volume 5     X   XDRV         NTFS   Partition    238 GB  正常
* Volume 6         Windows RE   NTFS   Partition   2065 MB  正常         非表示

Volume 6 に、Windows RE が割り当てられてる。パーティションサイズも2GBぐらいになっている。上手く行ってるように見える。


7. To exit from diskpart, run "exit"
7. diskpart を終了するには、exit を実行します。
DISKPART> exit

DiskPart を終了しています...

diskpart を抜けた。


8. To re-enable WinRE, run "reagentc /enable"
8. WinREを再度有効にするには、reagentc /enable を実行します。
>reagentc /enable
REAGENTC.EXE: 操作は成功しました。

WinREを有効にしたぞ、と。


9. To confirm where WinRE is installed, run "reagentc /info"
9. WinREがどこにインストールされているかを確認するには、reagentc /info を実行してください。
>reagentc /info
Windows 回復環境 (Windows RE) およびシステム リセット構成
情報:

    Windows RE の状態:         Enabled
    Windows RE の場所:         \\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE
    ブート構成データ (BCD) ID: c072bb99-b00d-11ee-a1fc-a01a7839d147
    回復イメージの場所:
    回復イメージ インデックス: 0
    カスタム イメージの場所:
    カスタム イメージ インデックス: 0

REAGENTC.EXE: 操作は成功しました。

元の状態になっているぞ、と。

これで、回復パーティションのサイズを増やすことができた。たぶん。


Note: If creation failed or you did not want to extend the WinRE partition,
注:作成に失敗した場合、またはWinREパーティションを拡張したくない場合、

run "reagentc /enable" to re-enable WinRE.
reagentc /enable を実行し、WinREを再有効化する。

途中で元の状態に戻したくなった時は、reagentc /enable を打って、WinRE を有効にすればいい。実際、セーフモードで作業して失敗した時は、以下を打って元に戻したりもした。
>reagentc /enable
REAGENTC.EXE: 操作は成功しました。

>reagentc /info
Windows 回復環境 (Windows RE) およびシステム リセット構成
情報:

    Windows RE の状態:         Enabled
    Windows RE の場所:         \\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE
    ブート構成データ (BCD) ID: c072bb97-b00d-11ee-a1fc-a01a7839d147
    回復イメージの場所:
    回復イメージ インデックス: 0
    カスタム イメージの場所:
    カスタム イメージ インデックス: 0

REAGENTC.EXE: 操作は成功しました。

さておき、この作業をしたメインPC上では、件の WindowsUpdateエラーが解消された。これでなんとかなったかもしれない…。

余談。この状況はヤバい :

一応作業できたっぽいので一安心したけれど。どう考えてもこんな作業、そのへんの一般的なWindows10ユーザができるとは思えないのですが…。少なくともウチの親父さんはこんな作業を絶対にできない…。

間違って作業したらOSがまるっと削除されたりするから、この状況はとてもヤバい気がする…。

2024/01/12追記 :

Windows10 x64 22H2をインストールしてあるサブPCでも、WindowsUpdateで同じエラーが出て、回復パーティションサイズも同じように500MB+αしかなかったので、同じ作業をして回復パーティションサイズを2GBにしてみた。

サブPCのディスクはGPTじゃなくてMBRだったけど、件の記事通りにMBR用のコマンドを打ったら回復パーティションを再作成することができた。

WindowsUpdateのエラーも出なくなった。少なくとも自分の環境では、回復パーティションサイズが足りないことが原因で件のエラーが出ていたようだなと…。

以上、1 日分です。

過去ログ表示

Prev - 2024/01 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project