とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

DeviceIoControl関数の使い方~CDドライブの回転速度を指定する

kernel32のDeviceIoControl関数はとてもややこしい・・・
1関数1機能ではなく、関数の第2引数dwIoControlCodeに制御コードを渡し、
その制御コードにしたがってデバイス操作を実現します。

また、制御コードによってその他の引数に指定する構造体(Buffer)が変化するので
予め制御コードに付随する構造体の内容を理解しておく必要があります。

DeviceIoControl関数の呼び出しに必要不可欠なのが
ファイル、またはデバイスへのハンドルです。

必然的にCreateFile関数を事前に呼び出す事になるので
呼び出しのサンプルコードをまとめておきました。

今回は制御コードであるIOCTL_CDROM_SET_SPEEDを使って
CDドライブの回転速度を指定しています。

CDドライブの回転速度を指定するサンプルコード

Change the rotational speed of the CD drive use by "DeviceIoControl"



Gistはこちら

DeviceIoControl呼び出しにあたり
制御コードである
const uint IOCTL_CDROM_SET_SPEED = 0x24060;
を指定しています。

IOCTLに関する制御コードは本家
DeviceIoControl関数
IOCTL_CDROM_SET_SPEED
よりも
Windows IOCTL Reference
が参考になります。

CDROM_SET_SPEED構造体が必要なので
こちらCDROM_SET_SPEED structureを参考に構造体を定義。

さらにCDROM_SET_SPEEDの中のEnumを
CDROM_SPEED_REQUEST enumeration

WRITE_ROTATION enumeration

参考に定義してやっとDeviceIoControl関数の呼び出しが行えます。

CDドライブの回転速度については何でもかんでも指定していいわけではなく
光ディスクの仕様によって数値が決まっているので

wiki(CD-ROM)を参考に
kbyteで指定してください。

ソリューション一式はこちらDeviceIoControlSampleよりダウンロード可能です。

アンマネージDLLの呼び出し方法ついてはマーシャリングに関する記事が参考になると思います。
C#からC++DLLを呼び出してマーシャリングの動きを確認した(前編)
▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

テーマ:プログラミング - ジャンル:コンピュータ

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/68-f0b4c7c8
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad