SSブログ

SilentCのユーザードライバーを試す前に SilentCの提供関数にアクセスする [SilentC]

Img_0933_s.jpgネタとしては尽きているかもしれません。noritanさん辺りが既にこの方法をやっているかな?。確か見なかった様にも思えるけれど。

ユーザードライバー側からSilentCで提供されている関数へのアクセスは勿論出来る訳です。
正式な手順?は多分、MoonLibrary.sを組み込んで、ProtoType.hのプロトタイプ宣言の通りに関数コールすると、まずMoonLibrary.sの中のコードに一旦飛んで、そこから目的の関数へジャンプする方法ですね。

これを、ちょっと違う方法で提供関数にアクセスしてみます。
まず提供関数を以下の様に定義します。これはMemClearとBufCopyの場合ですけれど、
#define MemClear ( ( void (*)(void *,uint32) )*((unsigned long *)0x0208) )
#define BufCopy ( ( void (*)(void *,void *,uint32) )*((unsigned long *)0x0204) )
で、Cソースには普通に
  char buf[ 32 ];
  MemClear( buf, sizeof(buf) );
  BufCopy( buf, "designed by hamayan", sizeof("designed by hamayan") );

注意点は、SilentCからユーザードライバーに入った場合は良いのですが、今回の様にデバッカーを使い、RAM上でデバックを開始している時は、SilentC側で初期化が済んでいないと動かない物が有ります。例えばSystemSleepとかですね。
まあ戻って来なくなるだけだったりするのでたいした事は有りませんが。

提供関数は結構便利な関数が多いですし、なにより4Kbyteしか無いユーザードライバー領域を節約できますね。

Interface (インターフェース) 2009年 01月号 [雑誌]

Interface (インターフェース) 2009年 01月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/11/25
  • メディア: 雑誌



nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

noritan

以下の記事で公開したプロジェクトの silentmoon.h ファイルにマクロによる一部のシステムコール宣言を記述しましたが、まだ未完成です。

http://noritan-micon.blog.so-net.ne.jp/2008-11-04
SilentC のメモリ管理をあばく

#define BufCopy (*((void (**)(void *dest,void *src,uint32 size))0x204))
#define MemClear (*((void (**)(void *dest,uint32 size))0x208))

こんな、とても人間が読むものではない記述になっています。

メリットは、JMP一回分の遅延(パイプライン・フラッシュのため、けっこう長い)が無くなる事。デメリットは、システム・コールを複数回呼び出すとコードが長くなることです。

by noritan (2008-11-30 22:29) 

hamayan

やはりマクロでやっていましたか。
関数のポインタのポインタ参照、、、駄目だ!頭がこんがらがるぅ!。

by hamayan (2008-11-30 22:40) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。