View Full Version : sys file
zoncpp
یک شنبه 08 مهر 1386, 09:42 صبح
سلام
یک درایور، منظورم یک sys file هست، آیا یک فایل Com می باشد؟
چطور می تونم کنترل کنم که وقتی sys فایلم، توسط برنامه های مختلف مورد استفاده قرار می گیره، متغیر های تعریف شده آن برای هر برنامه جدا گانه استفاده بشه.
منظورم اینه که من در sys چند متغیر تعریف کردم، برنامه ای که این sys را استفاده می کنه با این متغیرها کار می کنه و ممکنه مقدار آنها رو تغییر بده. بنابراین اگر چند برنامه از این sys فایل استفاده کنند ممکنه که متغیرهای مورد استفاده برنامه دیگر را تغییر بده!
Inprise
یک شنبه 08 مهر 1386, 14:06 عصر
آیا یک فایل Com می باشد؟
نه . درایورهای ویندوز ، فایلهای PE سی و دو یاشصت و چهار بیتی هستند که برای محیط Protected Mode ساخته میشن .
متغیر های تعریف شده آن برای هر برنامه جدا گانه استفاده بشه
این اتفاق همیشه میفته مگر اینکه خودت نخواهی
zoncpp
دوشنبه 09 مهر 1386, 09:20 صبح
این اتفاق همیشه میفته مگر اینکه خودت نخواهی
ولی من متغیرهایی تعریف کردم (در sys file) که توسط برنامه ای که از این درایور استفاده می کنه (با فراخوانی deviceIOControl) مقدار دهی می شوند.
اما زمانی که برنامه دوم را اجرا می کنم، این متغیر باید توسط برنامه دوم مقدار جدید بگیره، اما برنامه دوم با خطای Don't send متوقف شده و اجرا نمی شه.
به نظر شما چطور می تونم از این خطا و اشکال جلوگیری کنم. و مطمئن باشم که تعداد برنامه هایی که از این درایور استفاده می کنند محدود نیست؟
Inprise
دوشنبه 09 مهر 1386, 10:40 صبح
من تا برنامه ات رو نبینم نمیتونم حدسهای خوبی بزنم .
بهر حال باید دیباگش کنی تا مشخص بشه کجا متوقف میشه و دلیل اصلی مشکل چیه . بهر حال کل این مساله به مقدار متغیرها و ...مربوط نیست . شاید منطق کدی که نوشتی و ioctl هائی که بهش میدی برای کار مورد نظر مناسب نیست
zoncpp
دوشنبه 09 مهر 1386, 14:02 عصر
من تا برنامه ات رو نبینم نمیتونم حدسهای خوبی بزنم .
بهر حال باید دیباگش کنی تا مشخص بشه کجا متوقف میشه و دلیل اصلی مشکل چیه . بهر حال کل این مساله به مقدار متغیرها و ...مربوط نیست . شاید منطق کدی که نوشتی و ioctl هائی که بهش میدی برای کار مورد نظر مناسب نیست
تمام فکر من به متغیرهایم در Sys file و مقدار دهی آنها توسط برنامه ها ، منحرف بود. با توجه به نظر شما من باید به بررسی مشکل غیر از متغیرها بپردازم. مرسی:بوس:
هر نتیجه ای بگیرم مطرح می کنم، تا مشکلم حل بشه و این تاپیک هم کامل باشه.
zoncpp
شنبه 14 مهر 1386, 12:10 عصر
مشکل از CreateFile بود، چون من هندل بازگشتی این تابع رو Close نکرده بودم، زمانی که exe دوم CreateFile را فراخوانی می کند، هندل نا معتبر دریافت می کند. با CloseHandle بعد از فراخوانی DeviceIOControl مشکل اجرا نشدن exeی دوم حل شد.
اما .... مشکلی که مطرح کردم و حدس اولم بود همچنان باقی است.
بر فرض در exe قرار است دو بار ارتباط با درایور برقرار گردد، یعنی دو بار DeviceIOControl فراخوانی گردد. در ارتباط اول (فراخوانی DeviceIOControl اول) مقداری به درایور ارسال می گردد، که این مقدار در متغیری به نام Var (در درایور) ذخیره می گردد. در ارتباط دوم، همین مقدار از درایور به exe ارسال می گردد.
حالا exeی اول متغیر Var (در درایور) را مقدار دهی می کند. خب حالا اگر قبل از فراخوانی deviceIOControl دوم ، ما exeدوم را اجرا می کنیم پس exe دوم مقدار متغیر Var را تغییر می دهد، و حالا .... در exe اول ، deviceIOControl دوم فراخوانی می شود که مقدار اشتباه (تغییر داده شده توسط exe دوم) به این exe ارسال می گردد؟!!:عصبانی:
حالا چیکار کنیم؟؟؟؟؟؟؟؟:عصبانی++::نارا ت:
SMRAH1
یک شنبه 15 مهر 1386, 02:24 صبح
در مباحث WIN32 مطمئن باش که هر برنامه (dll , sys یا exe) فضای متغیر خودشو داره.در واقع اگر ده بار هم اجرا شوند (در حالی که در بقیه موارد هنوز کارشون تمون نشده) باز هم متغیر های همدیگر رو دست نمی زنند.
در واقع روش های پیشرفته (و البته کمی پیچیده) ای وجود داره که برنامه می تونه به متغیر های instance اول خودش دسترسی پیدا کنه (در واقع تا کید بر این موضوع می کنم که اگر هم بخواهند متغیر ها توی فضایی مشترک باشند و هر بار اجرا روی اون تاثیر بگذاره حتما باید از برنامه نویسی پیشرفته تری استفاده شود).
پس مطمئن باش که اشکال در کد است.بهتر است برنامه رو debug کنی.
موفق باشی
Inprise
یک شنبه 15 مهر 1386, 02:36 صبح
من نمیدونم چه نوع درایوری مینویسی و چطور . بنابراین نمیتونم بهت توصیه خاصی بکنم
اما اگر در DISPATCH_LEVEL هستی که احتمالا هستی از یک Spin Lock معمولی استفاده کن و قبل و بعد دستکاری متغیرت هم دو تا فلگ مختلف assert کن و برنامه ات رو تست کن . اگر روی خروجی دیباگ فلگ هات رو دیدی که مشکل از متغیرهات نیست ، اگر ندیدی و به احتمال زیاد سیستمت Crash کرد مشکل از متغیرت است .
zoncpp
یک شنبه 15 مهر 1386, 10:33 صبح
کلا درایور نویس حرفه ایی نیستم، در واقع اولین درایوریه که می نویسم، برای یک کار فوری نیاز به این درایور پیدا کردم. به همین دلیل اطلاعات زیادی ندارم.
اشتباه من این بود که متغیرم رو global تعریف کردم، بنابراین این متغیر در تمام برنامه هایی که با درایور در ارتباط هستند، مشترک می شد. این مورد رو رفع کردم و زمانی که با CreateFile هندل درایور رو به دست می گیرم و با درایور ارتباط دارم، متغیرم برای exe خودش تغییر می کنه و به exeی دیگه کاری نداره. ولی به محض اینکه در همان exe هندل رو Close می کنم و در جای دیگر از همین exeبرای ارتباط دوم CreateFile رو فراخوانی می کنم، هندل جدید باعث می شه متغیر جدید برای exe در نظر گرفته بشه. که فکر می کنم طبیعی باشه.
در واقع الزام در Close نمودن هندل درایور (برای امکان اجرای همزمان چند exe) و از طرفی الزام در مختص بودن متغیر برای هر exe (جهت ارسال و دریافت یک مقدار در فراخوانی های متعدد deviceIOControl) دو موضوع کاملا مخالف هم هستند، که من رو گیج کردند.
کاری که از دست من بر می یاد، محدود کردن ارسال و دریافت مقدار مورد نظر در تنها "یک" فراخوانی DeviceIOControl (برای هر exe) می باشد.
شاید راه حل بهتری وجود داشته باشه که به دلیل اطلاعات کمی که دارم به ذهن من نمی رسه: مثلا راهی برای آزاد نکردن هندل درایور (هندل بازگشتی تابع CreateFile) علی رغم این که بتوان در exeای دیگر به این درایور همچنان دسترسی داشت(با فراخوانی CreateFile در exeی دیگر خطای access denial نگیریم)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.