PDA

View Full Version : سوال: ارسال رشته با فرمت Hex به خروجی تابعی با نوع (LPSTR) ؟



بهروز عباسی
پنج شنبه 17 مرداد 1392, 15:24 عصر
درود به همه

من باید یه تابع بنویسم که محتویات MBR رو بخونه و به در قالب یک رشته با فرمت Hex برگردونه ؛برای این کار تابع زیرو نوشتم (برنامه کامل رو میذارم) ولی یه مشکل دارم چطوری مقدار به دست آمده رو به فرمت Hex در بیارم و توی یک متغیر (LPSTR) بریزم و به عنوان خروجی تابع به روتین فراخوان ارسالش کنم ؟
در واقع من لازم دارم این تابع رو توی یک DLL قرار بدم برای همین هم مهمه که بتونم مقدار خونده شده رو توی تابع به فرمت Hex در بیارم و ارسال کنم

کد در حالت اول که نتیجه رو اون طور که باید نشون میده (البته فقط توی کنسول و با استفاده از printf و نه در خروجی تابع)
#include <Windows.h>
#include <iostream>
//#include <conio.h>

using namespace std;
//void highlightHex(short X, short Y, HANDLE hConsole, BOOL bReset);

LPSTR GET_MBR();

int main() {
DWORD dwAddress = 0; short i = 8; HANDLE hConsole; BOOL bContinue = TRUE;
int curPosX = 0, curPosY = 0; COORD consoleCoord;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTitleA("Get_MBR");

cout<<GET_MBR()<<endl;

system("pause");
return 0;
}

LPSTR GET_MBR() {
DWORD BytRet;
unsigned char Sector[1024];
char _Result[1024];
HANDLE hDrive;

hDrive = CreateFileA(LPSTR("\\\\.\\C:"), GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

if (hDrive != INVALID_HANDLE_VALUE) {

if (ReadFile(hDrive, Sector, sizeof(Sector), &BytRet, NULL) == 0) {

printf(("ReadFile() error %08X\n"), GetLastError());
}
CloseHandle(hDrive);
}
else {

printf("CreateFile() error %08X\n", GetLastError());
}

for (int i = 512; i < 1024; i++) {
//[i]=Sector[i];
//
printf("%X ", Sector[i]);

}
return(" ");
}
اینم خروجی !

108754

--------------------------------------------------------------------------------------------------
اینم کدی که باید درست بشه ،درواقع باید به این شکل استفاده بشه

#include <Windows.h>
#include <iostream>
#include <conio.h>

using namespace std;
void highlightHex(short X, short Y, HANDLE hConsole, BOOL bReset);

LPSTR GET_MBR();

int main() {
DWORD dwAddress = 0;
short i = 8;
HANDLE hConsole;
BOOL bContinue = TRUE;
int curPosX = 0, curPosY = 0;
COORD consoleCoord;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTitleA("Get_MBR");

cout << GET_MBR() << endl;

system("pause");
return 0;
}

LPSTR GET_MBR() {
DWORD BytRet;
unsigned char Sector[1024];
char _Result[1024];
HANDLE hDrive;

hDrive = CreateFileA(LPSTR("\\\\.\\C:"), GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

if (hDrive != INVALID_HANDLE_VALUE) {

if (ReadFile(hDrive, Sector, sizeof(Sector), &BytRet, NULL) == 0) {

printf(("ReadFile() error %08X\n"), GetLastError());
}
CloseHandle(hDrive);
}
else {

printf("CreateFile() error %08X\n", GetLastError());
}

for (int i = 512; i < 1024; i++) {
_Result[i]=Sector[i];
//
//printf("%X ", Sector[i]);

}
return (_Result);
}

البته این درسته ولی مشکل همون فرمته Hex اه
اینم خروجی این تابع

108755


اگه قرار باشه اون متغییر Sector به این صورت نباشه یعنی تعداد خونه هاش مشخص نباشه باید چطوری اونو به خروجی پاس بدم ؟
unsigned char Sector; // or byte Sector

omidshaman
پنج شنبه 17 مرداد 1392, 16:19 عصر
فکر نکنم بدون دادن سایز مشخص بشه کاریش کرد .
با fstream نمیشه MBR رو خوند ؟

بهروز عباسی
پنج شنبه 17 مرداد 1392, 17:21 عصر
با fstream نمیشه MBR رو خوند ؟
با توابع خود سی هم میشه ولی من باید با Window API انجام بدم !

Ananas
پنج شنبه 17 مرداد 1392, 17:21 عصر
سوالت یکمی عجیب غریبه!
من نمدونم MBR چیه ولی اینطوری فهمیدم که سوالت ربطی به MBR نداره، درسته؟
انگار سوال شما یکی از موارد زیره:
- میخوای یک آرایه رو به خروجی بفرستی که سایزش مشخص نیست.
- می خوای اطلاعات باینری رو به رشته ی Hex تبدیل کنی.
--------------------------
در مورد اولی راهش اینه که سایز رو از طریق یک اشاره گر به عدد صحیح به خروجی بفرستی. مثال :

char * GetData(char ** pResult, int * pSize)
{
int SIZE = 1024;
*pSize = SIZE;
*pResult = (char *)malloc(sizeof(char) * SIZE);
for (int i = 0; i < SIZE; i++)
{
(*pResult)[i] = i + char('0');
};

return *pResult;
};

دومی هم که مشخصه به ازای هر بایت باید دو تا کاراکتر بنویسی مثلا : "FF". تبدیل بایت به نوشته رو هم که خودت واردی بایت به بایت میخونی تبدیل میکنی به رشته.

بهروز عباسی
پنج شنبه 17 مرداد 1392, 17:34 عصر
سوالت یکمی عجیب غریبه!
فکر کنم این دومین باره این جمله رو برای برنام های من به کار میبری :لبخند:

من نمدونم MBR چیه ولی اینطوری فهمیدم که سوالت ربطی به MBR نداره، درسته؟
Master Boot Record = 512 بایت اول درایو اصلی که اطلاعات مربوط به load شدن Kernel توسط Boot Loader ازش خونده میشه !.
واینکه حق با شماست در کل ربطی به سوال نداره.


انگار سوال شما یکی از موارد زیره:
- میخوای یک آرایه رو به خروجی بفرستی که سایزش مشخص نیست.
- می خوای اطلاعات باینری رو به رشته ی Hex تبدیل کنی.
هردو ولی بیشتر اولی کلافم کرده!

Ananas
پنج شنبه 17 مرداد 1392, 17:41 عصر
فکر کنم این دومین باره این جمله رو برای برنام های من به کار میبری :لبخند:
آخه برنامه هایی که مینویسی خیلی برام غریبه، کلا تو فاز و دنیای دیگست، برنامه های شما اشکال نداره ها! من تو فازش نیستم برام کاملا نا آشناست.

هردو ولی بیشتر اولی کلافم کرده!
روش اولی رو من زیاد به کار میگیرم. کاملا برام واضحه، اگه خواستی بیشتر توضیح بدم.

omidshaman
پنج شنبه 17 مرداد 1392, 17:52 عصر
البته فکر نکنم این چیزی که ایشون میخوان اون روش اول باشه!
الان داخل BytRet چی ذخیره میشه؟(اگر تعداد کاراکتر خونده نشده باشه که میشه سوال اولو حل کرد)!
بعد نمیشه با GetFileSize (http://msdn.microsoft.com/en-us/library/aa364955%28VS.85%29.aspx) بیای اندازه MBR رو بدست بیاری بعد بر اساس اون سایز بافر رو بزاری ؟‌(sector منظورمه )

مصطفی ساتکی
پنج شنبه 17 مرداد 1392, 17:58 عصر
شما از stream استفاده کنید به راحتی می تونید این کارو انجام بدید.شما بایستی LPSTR را داخل dll موردنظر malloc کنید.

LPSTR convert2Hex(vector<uchar> sector)
{
stringstream hex_stream;
for (size_t i=0; i < sector.size();i++)
hex_stream << hex << setw(2) << setfill('0') << int(sector[i]) ;


LPSTR res = (LPSTR)malloc(strlen( const_cast<char *>(hex_stream.str().c_str())));
strcpy(res, const_cast<char *>(hex_stream.str().c_str()));
return res;

}
int main()
{
vector<uchar> sector(255,0);
//generate random bmr
for (size_t i=0;i < sector.size();i++)
sector[i] = rand()%255;

cout << convert2Hex(sector);
}


108773

بهروز عباسی
پنج شنبه 17 مرداد 1392, 18:05 عصر
بعد نمیشه با GetFileSize (http://msdn.microsoft.com/en-us/library/aa364955%28VS.85%29.aspx) بیای اندازه MBR رو بدست بیاری بعد بر اساس اون سایز بافر رو بزاری ؟‌(sector منظورمه )
مشکل MBR نیست برنامه اصلی چیز دیگه ایه این فقط نمونه بود برای سوال قسمت های خاص فایل ها رو میخونه !

omidshaman
پنج شنبه 17 مرداد 1392, 18:19 عصر
مشکل MBR نیست برنامه اصلی چیز دیگه ایه این فقط نمونه بود برای سوال قسمت های خاص فایل ها رو میخونه !
خب مشکل چیه ؟مگه نمی خواستی بدونی سایز sector چجوری متغیر باشه ؟!
کل فایل رو اون جوری بخون بعد قسمت خاصشو جدا کن با سایزش return کن با همون روش اقای Ananas!

مصطفی ساتکی
پنج شنبه 17 مرداد 1392, 18:37 عصر
کل فایل رو اون جوری بخون بعد قسمت خاصشو جدا کن با سایزش return کن با همون روش اقای Ananas!
حالا امید دیگه چرا سایز رشته را مجدداً به روش ananas برگردونه طول رشته که مشخصه اگر از return value استفاده کنه فقط بایستی یه char* برگردونه و اگر هم بخاد از پارامتر بر گرونه یه char** همین.

omidshaman
پنج شنبه 17 مرداد 1392, 18:40 عصر
حالا امید دیگه چرا سایز رشته را مجدداً به روش ananas برگردونه طول رشته که مشخصه اگر از return value استفاده کنه فقط بایستی یه char* برگردونه و اگر هم بخاد از پارامتر بر گرونه یه char** همین.
آره اصلا به سایز هم نیاز نیست ...

omidshaman
پنج شنبه 17 مرداد 1392, 18:58 عصر
البته الان ممکنه نیاز به سایز هم بشه ما اگر دینامیک حافظه بگیریم سایزشو با sizeof نمی تونیم بدست بیاریم .
طول رشته هم که مشخص نیست اصلا سوال همینه !

مصطفی ساتکی
پنج شنبه 17 مرداد 1392, 19:02 عصر
ا
طول رشته هم که مشخص نیست اصلا سوال همینه !
یه حرفایی میزنی طول رشته بالاخره که در تابع تعیین میشه همون جا هم براش فضا اشغال میشه فقط برای رشته همچین چیزی صدق می کنه شما از آدرس ابتداش برو تا زمانیکه برسی '\0' اینو من تضمین می کنم بری جلو مطمئن باش گم نمی شی نترس پیداش می کنی .اگر نوع داده ای تصویر بود حرفت درست بود.

omidshaman
پنج شنبه 17 مرداد 1392, 19:09 عصر
یه حرفایی میزنی طول رشته بالاخره که در تابع تعیین میشه همون جا هم براش فضا اشغال میشه فقط برای رشته همچین چیزی صدق می کنه شما از آدرس ابتداش برو تا زمانیکه برسی '\0' اینو من تضمین می کنم بری جلو مطمئن باش گم نمی شی نترس پیداش می کنی .اگر نوع داده ای تصویر بود حرفت درست بود.
نه آخه ایشون معلوم نیست چی اصلا دارن می خونن !
بعد این که اصلا معلوم نیست ReadFile اون \0 رو بزاره یا نه تهش میشه خودمون اضافه کنیم ولی چه کاریه خب؟! سایز هم بر می گردونیم

مصطفی ساتکی
پنج شنبه 17 مرداد 1392, 19:13 عصر
امییییییییییییییییییییید
نمونه ای که من گذاشتم رو تست کن راحت متوجه میشه ایشون میخاد از یه آدرس حافظه n تا خونه بخونه در ضمن میخاد تو delphi استفاده کنه LPSTR جز انواع مزخرف Windows همه جا هم موجوده.

omidshaman
پنج شنبه 17 مرداد 1392, 19:20 عصر
امییییییییییییییییییییید
نمونه ای که من گذاشتم رو تست کن راحت متوجه میشه ایشون میخاد از یه آدرس حافظه n تا خونه بخونه در ضمن میخاد تو delphi استفاده کنه LPSTR جز انواع مزخرف Windows همه جا هم موجوده.
نه دیگه شما خودت دوختی خودتم جواب دادی بنده خدا کی گفت میخواد همچین کاری بکنه
این پست اول !

اگه قرار باشه اون متغییر Sector به این صورت نباشه یعنی تعداد خونه هاش مشخص نباشه
منظور این بوده ما یک فایل داریم سایزش مشخص نیست چطوزی بیایم کلشو بخونیم
بعد به این نتیجه رسیدیم که بیاد سایز فایلو بدست بیاره کلشو بخونه بعد اون قسمتی که میخواد رو جدا کنه مثلا شاید بخواد بین ۲ تا تگ SQ !SQ رو جدا کنه معلوم نیست که می خواد n تا بخونه ! ممکنه چیزایی که این وسطن سایزشون تو هر ویندوزی فرق کنه فایل بوته دیگه (البته شایدم شما درست بگی یکم گنگه سوال من اون جوری برداشت کردم !)

مصطفی ساتکی
پنج شنبه 17 مرداد 1392, 19:25 عصر
ای بابا
من اولین پستو کار دارم و گرنه طرف بایستی ویرایشش کنه تو اونم همچین چیزی ذکر نشده اگر طرف خودشم داخل function ندونه چقدر باید بخونه چرا داره کد مینویسه.

بهروز عباسی
پنج شنبه 17 مرداد 1392, 19:29 عصر
آقای ساتکی کدی که برای فرمت هکز قرار دادید با چه کامپایلری نوشتید و چه هدرهایی باید Include بشه ؟


خب مشکل چیه ؟مگه نمی خواستی بدونی سایز sector چجوری متغیر باشه ؟!
مشکل فعلا خیلی بیخدار شده:لبخند: دارم حلش میکنم حل شد کامل توضیح میدم
شما این خط رو ببین
_Result[i]=Sector[i];
طول هرذو 1024تاست پس مشکلی نسیت محتوبات Sector توی _Resultکپی بشه ولی اگه طول Sector مشخص نباشه نمیشه به اینصورت (آرایه ای و با اندیس) مقادیر رو کپی کرد !

یه کم خودم هم قاطی کردم خدائیش امروز خیلی خسته شدم هم دارم واسه کنکور میخونم هم دوسه تا مشکل بزرگ دارم که چندروزه نمیتونم برطرفشون کنم

بهروز عباسی
پنج شنبه 17 مرداد 1392, 19:32 عصر
منظور این بوده ما یک فایل داریم سایزش مشخص نیست چطوزی بیایم کلشو بخونیم اقای ساتکی درست میگه من n تا لازم دارم ! از 512همین بایت اول هارد به طول 512تا ولی هرکدوم از این 512تا متفاوته کلا به فایل ربطی نداره
البته توی این نمونه توی برنامه اصلی هم به جای هارد یه فایل داریم که از یه بخش خاصش (PE مربوط به فایل های اجرایی ویندوزه) باید بخونم

مصطفی ساتکی
پنج شنبه 17 مرداد 1392, 19:41 عصر
آقای ساتکی کدی که برای فرمت ***ز قرار دادید با چه کامپایلری نوشتید و چه هدرهایی باید Include بشه ؟

vs2012.

#include <Windows.h>
#include <vector>
#include <iostream>
#include <sstream>
#include <iomanip>

uchar= unsigned char

معلومه واقعاً خسته اید این include ها را روزی 60 بار استفاده می کنیم.

omidshaman
پنج شنبه 17 مرداد 1392, 19:43 عصر
ای بابا
من اولین پستو کار دارم و گرنه طرف بایستی ویرایشش کنه تو اونم همچین چیزی ذکر نشده اگر طرف خودشم داخل function ندونه چقدر باید بخونه چرا داره کد مینویسه.
عجب آخر پست اول رو نگاه کن دقیقا همینه !:لبخند:

طول هرذو 1024تاست پس مشکلی نسیت محتوبات Sector توی _Resultکپی بشه ولی اگه طول Sector مشخص نباشه نمیشه به اینصورت (آرایه ای و با اندیس) مقادیر رو کپی کرد !
اقای ساتکی درست میگه من n تا لازم دارم ! از 512همین بایت اول هارد به طول 512تا ولی هرکدوم از این 512تا متفاوته کلا به فایل ربطی نداره

خلاصه من که نفهمیدم چی شد چطوری طول ۵۱۲ ست بعد طولشون متفاوته !؟

brightening-eyes
جمعه 18 مرداد 1392, 16:23 عصر
فکر کنم شما میخوای 512 بایت درایو روا بخونی که همون سکتر بوت لودر باشه
آره؟