DDK是否可以用C++來撰寫程式呢? |
答題得分者是:暗黑破壞神
|
Blueberrug
一般會員 發表:14 回覆:50 積分:17 註冊:2005-05-22 發送簡訊給我 |
您好:
想要請問是否可以用C 的語法來寫DDK的程式呢? 因為我想要在DDK宣告一個類別的東西, 所以才會這樣詢問大家的, 而且不知為何我無法動態配置記憶體空間呢? 例如: #include char *Str; Str = (char*)malloc(10); 每次組譯出來總是有這樣的錯誤訊息, error LNK2019: unresolved external symbol __imp__malloc referenced in function _DriverEntry@8 所以是否可以告知小弟要如何Link C Library呢?謝謝各位的幫忙啊! 另外請問大家知道如何在DDK使用cpp的程式呢? 編輯記錄
Blueberrug 重新編輯於 2007-06-01 08:55:31, 註解 無‧
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
這分成幾個問題。
1.你為什麼用 DDK? 你知道 DDK 的全名是什麼嗎? 2.除了組合語言,不然我們不叫”組譯”,都叫編譯。 3.Link 出現的錯誤,不是跟你說得很清楚了嗎?你沒去寫 DriverEntry 這個函數。 ===================引 用 Blueberrug 文 章=================== 而且不知為何我無法動態配置記憶體空間呢? 每次組譯出來總是有這樣的錯誤訊息, error LNK2019: unresolved external symbol __imp__malloc referenced in function _DriverEntry@8 |
Blueberrug
一般會員 發表:14 回覆:50 積分:17 註冊:2005-05-22 發送簡訊給我 |
先謝謝版主的回答:
回答如下: 1 我要用DDK的關係是利用Driver來寫封包,全名為Driver Development Kit,不過我是用ForXP的。 2 關於組譯及編譯,小弟的知識不足,謝謝站長的教導。 3 我有寫DriverEntry這個函式,只是我在這個函式中宣告一各char *Buffer,想要配置記憶體給Buffer就會出現Link的錯誤。函式如下 <textarea class="cpp" rows="10" cols="60" name="code"> NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { char *Buffer; PDEVICE_OBJECT deviceObject = NULL; NTSTATUS status; UNICODE_STRING NtNameString; UNICODE_STRING Win32NameString; KdPrint( ("Hello: Entered the HELLO driver!\n") ); // create counted string version of our device name; RtlInitUnicodeString( &NtNameString, NT_DEVICE_NAME ); // create the device object status = IoCreateDevice( DriverObject, 0, &NtNameString, FILE_DEVICE_UNKNOWN, 0, FALSE, &deviceObject ); if ( NT_SUCCESS(status) ) { // create dispatch points for create/open, close, unload. DriverObject->MajorFunction[IRP_MJ_CREATE] = HelloOpen; DriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloClose; DriverObject->DriverUnload = HelloUnload; KdPrint( ("Hello: just about ready!\n") ); // create counted string version of our win32 device name. RtlInitUnicodeString( &Win32NameString, DOS_DEVICE_NAME ); // create a link from our device name to a name in the win32 namespace. status = IoCreateSymbolicLink( &Win32NameString, &NtNameString ); if (!NT_SUCCESS(status)) { KdPrint( ("HELLO: Couldn't create the symbolic link\n") ); IoDeleteDevice( DriverObject->DeviceObject ); } else { Buffer = (char*)malloc(10); KdPrint( ("HELLO: All initialized!\n") ); } } else { KdPrint( ("HELLO: Couldn't create the device\n") ); } return status; } </textarea> ===================引 用 暗黑破壞神 文 章=================== 這分成幾個問題。 1.你為什麼用 DDK? 你知道 DDK 的全名是什麼嗎? 2.除了組合語言,不然我們不叫”組譯”,都叫編譯。 3.Link 出現的錯誤,不是跟你說得很清楚了嗎?你沒去寫 DriverEntry 這個函數。 ===================引 用 Blueberrug 文 章=================== 而且不知為何我無法動態配置記憶體空間呢? 每次組譯出來總是有這樣的錯誤訊息, error LNK2019: unresolved external symbol __imp__malloc referenced in function _DriverEntry@8
編輯記錄
Blueberrug 重新編輯於 2007-06-01 11:06:43, 註解 無‧
Blueberrug 重新編輯於 2007-06-01 11:07:52, 註解 無‧ Blueberrug 重新編輯於 2007-06-01 11:11:19, 註解 無‧ |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
Blueberrug
一般會員 發表:14 回覆:50 積分:17 註冊:2005-05-22 發送簡訊給我 |
您好:
我加了extern "C"之後, 編譯之後還是有錯誤,原文如下: error C2059 : syntax error : 'string' 而且我也先照著站長的意思先把Buffer註解, 也是有相同的錯誤,反而是我沒有加extern "C"及malloc那行可以編譯成功, 看來我真的不知道問題所在,是我哪各地方沒有看清楚, 才會不知道這樣的錯誤呢? ===================引 用 暗黑破壞神 文 章=================== extern "C" NTSTATUS DriverEntry (IN PD.......) 改成這樣吧。 這一句的錯誤跟你的 malloc 無關。 你把你的 malloc 那行去掉,我想這一個 error 也還會在。 所以你似乎沒抓到問題的重心。 |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
1.把所有你的 error message 全丟上來吧。一個一個討論要討論到什麼時候?
2.不過全部的問題除了原來那個之外,應該還有一個。 你知道為什麼 printf 會改成 KdPrint 嗎? 想想看,我們再討論。 這跟你的問題是同樣的答案。 ===================引 用 Blueberrug 文 章=================== 您好: 我加了extern "C"之後, 編譯之後還是有錯誤,原文如下: error C2059 : syntax error : 'string' 而且我也先照著站長的意思先把Buffer註解, 也是有相同的錯誤,反而是我沒有加extern "C"及malloc那行可以編譯成功, 看來我真的不知道問題所在,是我哪各地方沒有看清楚, 才會不知道這樣的錯誤呢? ===================引 用 暗黑破壞神 文 章=================== extern "C" NTSTATUS DriverEntry (IN PD.......) 改成這樣吧。 這一句的錯誤跟你的 malloc 無關。 你把你的 malloc 那行去掉,我想這一個 error 也還會在。 所以你似乎沒抓到問題的重心。 |
Blueberrug
一般會員 發表:14 回覆:50 積分:17 註冊:2005-05-22 發送簡訊給我 |
您好:
我用KdPrint的原因是因為我目前是使用"Win XP Checked Build Environment"來編譯的, 是為了看我目前的驅動程式執行到哪部份而已, 你說為什麼要將printf改成用KdPrint嗎? 我只知道我是用Checked來編譯的只能用KdPrint 若是要用Free來編譯的話,好像可以用DbgPrint吧! 不知道這樣是否有回答問題呢?感覺好像答非所問似的,對不起。 我的error message目前只有上次所說的而已, 主要我是想要在Driver可以使用cpp的檔案以及C 的類別 但我又不太清楚要怎麼可以在DDK上使用cpp檔案及C 類別, 又看到書上說無法使用c 的new及delete, 所以我就用C的malloc及free函式來配置記體空間, 但不管怎麼呼叫都是錯的,因此才先改成配置一各char *Buffer來配置記憶體看看, 這就是我的問題,因為小弟大多都是在BCB寫程式,才會不知道DDK要怎麼使用, 書上大多都沒有提到malloc及C 的類別使用方式, 才會上網來尋找答案,謝謝您的幫忙啊! ===================引 用 暗黑破壞神 文 章=================== 1.把所有你的 error message 全丟上來吧。一個一個討論要討論到什麼時候? 2.不過全部的問題除了原來那個之外,應該還有一個。 你知道為什麼 printf 會改成 KdPrint 嗎? 想想看,我們再討論。 這跟你的問題是同樣的答案。 |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
你是不是在寫 driver?
你的 Kdprint 是不是用來取代 printf? 為什麼書上說不能用 new? 因為 printf, new, malloc.....都是 user level 的函數。 你要寫 driver 要用那一層的函數。你想想要是你用 malloc 去動到 kernel 在用的記憶體配置。那不是天下大亂了嗎? 所以你該找一下看看 driver 那層,對應的函數是那一個。 就像你不會去用 printf 而得用 Kdprintf 一樣。 ===================引 用 Blueberrug 文 章=================== 我用KdPrint的原因是因為我目前是使用"Win XP Checked Build Environment"來編譯的, 是為了看我目前的驅動程式執行到哪部份而已, 你說為什麼要將printf改成用KdPrint嗎? 我只知道我是用Checked來編譯的只能用KdPrint 若是要用Free來編譯的話,好像可以用DbgPrint吧! 不知道這樣是否有回答問題呢?感覺好像答非所問似的,對不起。 我的error message目前只有上次所說的而已, 主要我是想要在Driver可以使用cpp的檔案以及C 的類別 但我又不太清楚要怎麼可以在DDK上使用cpp檔案及C 類別, 又看到書上說無法使用c 的new及delete, 所以我就用C的malloc及free函式來配置記體空間, 但不管怎麼呼叫都是錯的,因此才先改成配置一各char *Buffer來配置記憶體看看, 這就是我的問題,因為小弟大多都是在BCB寫程式,才會不知道DDK要怎麼使用, 書上大多都沒有提到malloc及C 的類別使用方式, |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |