DCSIMG
Asaf Shelly
Sharing Events Between Kernel and User
Wednesday, September 12, 2012 9:25 AM

I'm writing this because the WDK documentation left things out.

This API: IoCreateSynchronizationEvent says that you have two options to share an Event with user-mode application: 1. The process creates an event and sends the handle to the driver (more secure) and 2. Use named events.

The documentation says that named evevnts require "\\BaseNamedObjects\Xxx" on the driver's side and "xxx" on the process side. This should be "\BaseNamedObjects\Xxx" with one back-slash. Your code should look like this "\\BaseNamedObjects\\Xxx" and not like this: "\\\\BaseNamedObjects\\Xxx"

Also I found that the user space process created the Named Event under "\Sessions\1\BaseNamedObjects\Xxx" where 1 is the Session ID and Xxx is the Event Name.

I assume that this is relevant for KeInitializeEvent, IoCreateSynchronizationEvent, and ZwCreateEvent.

Using an administrator account, not running the process using "Run as administrator" this works.

 

 

by AsafShelly | with no comments
תגים:,
Eastronics Compact 7 Session
Thursday, June 28, 2012 10:56 AM

Hopefully everyone attending enjoyed the session.

You can find my presentation here: Windows Compact 7 - Asaf Shelly

(Technical website: http://www.asyncop.com/; My Intel Blog: http://software.intel.com/en-us/blogs/author/asaf-shelly/)

 

Launching 64bit process from 32bit process using CreateProcess in C# .Net
Sunday, May 20, 2012 4:54 PM

I was required to execute a Java applet from within a C# application. It kept failing until I found out that it needed 3GB of RAM and the process was 32 bit by default. I then set the .Net process to build specifically as 64 bit.

Now I needed to use a 32 bit dll, so I had to use a 32 bit process. The solution is to use the explicit path c:\Windows\Sysnative, so for example the command line "Java -d64 -cp" would be "c:\Windows\Sysnative\Java.exe -d64 -cp", and "cmd.exe" would be "c:\Windows\Sysnative\cmd.exe". You can see on the task manager that the process does not have a "*32" next to its name.

This is valid if you want to force 64 bit from 32 bit application, CreateProcess specifically 64 bit, shellexecute 64 bit process from 32 bit process, child process 64 bit from 32 bit process.

by AsafShelly | with no comments
תגים:,
פיתוח אלגוריתמים
Sunday, March 11, 2012 11:14 AM

בפוסט קודם דיברתי על מתכנתי אמבדד ופיתוח דרייברים. בסוף הפוסט הזכרתי אלגוריתמיקה כהיתרון התחרותי וההגנה הטובה ביותר מפני העתקה. אם יש לך אלגוריתם ייחודי לא צריך פטנט. הרי בכל מקרה פטנט צריך לרשום בהרבה מקומות בעולם, ויש מדינות חשובות שלא ממש יתיחסו אליו (מזרח). בנוסף חברה שאין לה משאבים אינסופיים כנראה לא תצליח להתמודד בבתי משפט מול חברות ענק על מנת להגן על הפטנטים שלה. הפתרון הוא אלגוריתם.

אלגוריתם הוא בעצם תכנון קוד. לא משנה באיזו שפה הוא כתוב ולא צריך להוכיח שהמצאת משהו חדש. מה שחשוב הוא הידע איך לגרום למחשב לקחת מידע מסויים ולחלץ או לחשב מידע אחר, למשל לקבל תמונה ולהוציא שם של מצולם, או לקבל קובץ של שיר ולהוציא את אותו השיר בפחות נפח.

מי שחשב שתשתיות תוכנה לעיבוד מקבילי הן בעייתיות ימצא בעיות הרבה יותר גדולות בתחום האלגוריתמיקה. קודם כל הנחת היסוד היא שיתבצע שימוש מקסימלי בחומרה ולכן עבודה מקבילית היא מובנת מאליה. תשתית מולטימדיה של מיקרוסופט "DirectShow" קיימת עוד לפני שנת 2000 ומחייבת תכנון מקבילי ומבוססת על תרשימי זרימה של מידע. כנ"ל לגבי מיון וחיפוש מידע, בסיסי נתונים, ועוד.

כמות רבה מאד של אנשי הפיתוח בתחום הם מתמטיקאים ופיזיקאים. כלי העבודה לא כוללים Visual Studio אלא Matlab (מטלב) שהוא כלי מתמטי תיאורטי שעושה עבודה נפלאה אבל לא באמת מייצר מוצר שאפשר למכור.

מכאן יוצא שרוב הכלים של עולם הפיתוח אינם מתאימים לאלגוריתמיקה ומודלים אלגוריתמיים לא באמת מתחשבים במתכנת שבמקרה הזה הוא פועל הייצור. אפס יכולות debug, אפס תמיכה במערכות הפעלה שונות, אפס תכנון לחומרה עתידית, כמעט תמיד.

כאשר אני עובד על אלגוריתמים של עיבוד תמונה וקול אני משתמש בתשתיות כמו DirectShow ובכלים דוגמת GraphEdit. באופן כזה אין באמת יכולת לשים breakpoint ולהבין מה קרה במערכת ואחד הפתרונות הוא כלי debug שמיועדים לפיתוח דרייברים.כך או כך, אנחנו מאבדים את היכולות והעוצמה של Visual Studio.

אחד הפתרונות היותר טובים הוא שימוש בזכרון משותף (Shared Memory). יש מעט מקרים שבהם הייתי ממליץ על הטכניקה הזו על פני למשל Pipe או Socket. במקרה הזה אין ספק שמדובר בפתרון טוב. העקרון הוא לחלק את הקודק לשני חלקים האחר הוא ממשק כלפי התשתית והשני מבצע את העיבוד. הראשון הוא פילטר ששולח את המידע שנכנס לזכרון משותף ומקבל את המידע שצריך להעביר הלאה דרך זכרון משותף. הרכיב השני הוא אפליקציה שפועלת תחת Debug ב- Visual Studio. כך אפשר לראות משתנים, לעצור, להמשיך, ולהבין מאיפה הגיע Exception. את הפיתוח אפשר לבצע אפילו בשפות .Net. פתרון כזה מקצר משמעותית תהליכי פיתוח.

דוגמא לשימוש בזכרון משותף אפשר למצא כאן: Shared Memory. ניתן להוריד את הספריה הסגורה כאן: WinModules.

מי שמתעניין בפיתוח אלגוריתמים מוזמן לקרא עוד על AVX, ועל C++ AMP.

בהצלחה,
אסף

המרחק בין מתכנת למתכנת אמבדד
Wednesday, February 29, 2012 11:05 AM

קודם כל חשוב לומר שאין קשר לסביבת הפיתוח, לתשתיות, לאוסף הכלים וה- API. שום קשר.

בעולם מיקרוסופט יש לנו מספר מערכות הפעלה שונות שעליהן מפתחים, לרוב בעזרת Visual Studio:

1. Win32 API, User-Mode, C\++, C#, MFC, Java, וכד'

2. שרתים, Asp.Net, HPC, וכד'

3. Windows CE

4. Windows NT Kernel

5. WebBrowser, JavaScript, AJAX, וכד'

למי ששואל את עצמו, הגרסאות השונות של Windows Embedded הן בעצם דרך לבנות Desktop או Server.

יש בישראל הרבה מתכנתים מכל הסוגים שהזכרתי. בדרך כלל יהיה קל יותר למתכנת מקבוצה מסויימת לפתח שיחה עם מתכנת מאותה הקבוצה. מדובר בקהילה ובתרבות וכנראה שדווקא זה כן קשור לסביבת העבודה ואופי המוצרים.

מי שמכיר אותי יודע שיש לי נסיון רב בתשתיות תוכנה ובאפליקציות למשל Windows Internals ופיתוח דרייברים, שרתי מדיה, IIS, ו- HPC, וגם UI ב- MFC ובבורלנד C++. זה מוכיח שלא מדובר בסוג שונה של אנשים ומתכנת אפליקציות web יכול להיות גם מפתח דרייברים.

ההבדל העיקרי הוא בגישה.

לדוגמא כאשר אני עובד עם C#, אני מתאמץ פחות לבדוק פרמטרים ולוודא שאובייקטים מתוחלים. יכול להיות למשל שתמונה שנשלחה לעיבוד היא בגודל 0X0. אני לא טורח לבדוק את זה ברוב המקרים כאשר אני עובד עם C#. מה העלות של שגיאה? מקסימום נקבל הודעה ונלחץ Continue. לעומת זאת כאשר אני מקבל תמונה לקוד C\++ אני מוודא שלתמונה יש משטח עבודה לפני שאני מתחיל לעבוד איתה. בעבודה של פיתוח דרייברים אני מקפיד לוודא שהזכרון בגודל הנכון ושיש הרשאות גישה אל האובייקט לפני שאני בודק את הפרמטרים שאחד מהם הוא התמונה. העלות כאן היא מאד גבוהה כיוון שטעות תגרום למסך כחול.

יש מוצרים מבוססים Windows CE שכתובים גרוע. יש לי טלפון GPS שהוא Pocket PC ישן יחסית ויש לו דליפות זכרון, אפליקציות מתנהגות לא נכון, ומידי פעם אני מקבל Exception של תוכנת הניווט, בעיקר בטעינה.

ההבדל בין איכות פיתוח של מוצר אחד מאחר הוא בהקשחה. מוצרים שמפותחים בגישה של אמבדד בדרך כלל נוטים להיות חסינים לתקלות. בהרבה פעמים כחלק מההקשחה יש הגדרה קשיחה של חומרה ותשתיות תוכנה. ככה למשל Microsoft Media Center יעבוד רק עם סוגים מסויימים של כרטיסי מסך וטלוויזיה, ומערכת ההפעלה של Apple תגיע עם חומרה מוגדרת מראש של Apple.

הגורם העיקרי בהקשחה הוא התכנון. מוצר מוגדר לסביבת חומרה ותוכנה מסויימת רק אם תוכנן מראש. אם אני מתחיל לכתוב אפליקציה ורק אחרי שאפשר להדגים אותה אני מחפש את הלקוחות ומתאים את עצמי אליהם, הרי שלא ניתן להגדיר מראש סביבת ריצה. במקרים רבים ההגדרה היא מראש שהמוצר צריך להתאים לכל סביבת ריצה ושאין טעם לוודא כל סביבה. אתרי אינטרנט פשוטים עובדים ככה. אתרים אחרים כמו YouTube למשל מקשיחים דרישות מינימום של דפדפנים שעליהם נבדקו.

דוגמא מהתחום האפור היא למשל נגן המדיה של מיקרוסופט שעובד מול כל קודק שמותקן על המחשב ונתמך DirectShow (או Media Foundation). לעיתים הנגן פולט הודעה לא ברורה כמו "הרכיב דיווח שגיאה מסוג 80003452, לא ניתן לנגן או אין קובץ". הסיבה לכך היא שנגן המדיה משתמש בכל רכיב צד שלישי והדיווח היחיד שהוא מקבל מהתשתית הוא מספר תקלה שלעיתים מסמל תקלה כללית כמו פרמטר לא נכון או תקלה פנימית.

כדוגמא לא טובה מהתחום האפור נקח את Windows Live Movie Maker של חלונות 7. כאשר עבדתי על הוידאו שבקישור, לאחר סיום העריכה ניסיתי לייצר את הוידאו וקיבלתי הודעה שאומרת שיש בעיה לייצר את הוידאו הערוך בגלל בעיה בקובץ. "הסר מהפרוייקט קובץ שמפריע ונסה שוב". זאת דוגמא לא טובה כיוון שהתוכנה יכלה לספר לי באיזה קובץ מדובר אלא שמישהו סתם התעצל לוודא את תהליכי התוכנה.

המסקנה שלי היא שגם אם חלונות CE תעלם מן העולם ולא יהיו יותר מערכות הפעלה ייעודיות לשרתים, וכל הפיתוח יתבצע על מערכת הפעלה חלונות 9 ועל אנדרואיד, עדיין יהיה הבדל מהותי בין סוגי הפיתוח השונים, ויהיו מתכנתי אמבדד על C# (עם UMDF) ויהיו מתכנתי מודולים ב- C שלא יודעים על איזו סביבה הם רצים (Metro, Win32, Android, וכד').

לסיום חומר למחשבה:

יש סוג נוסף של פיתוח שלא הזכרתי: אלגוריתמיקה ופיתוח אלגוריתמים. זהו הדבר היחיד שאי אפשר להעתיק במזרח או לבצע ב- outsource בחו"ל. נתראה שם בעוד 5 שנים.

סדרת הרצאות מצולמות בנושא מחשוב מקבילי בחסות אינטל
Thursday, February 23, 2012 10:56 PM

מדובר בשישה פרקים באורכים משתנים, כולם באנגלית, שצולמו לפני מספר חודשים וישוחררו לצפיה כל מספר שבועות. הסדרה מתחילה בבסיס של מחשוב מקבילי ומסבירה למה מחשוב מקבילי ממש קל, וממשיכה דרך ארכיטקטורה ומודלים, ועד טכנולוגיות מתקדמות דוגמת AVX (יכולת DSP של X86). הוידאו הראשון יפורסם בימים הקרובים באתר של אינטל העולמית.

למידע נוסף:

http://software.intel.com/en-us/blogs/2012/02/23/pre-release-parallel-programming-and-architecture-video-series/

אסף

Microsoft Office Animation Issue?
Sunday, January 01, 2012 5:03 PM

I'm using Microsoft Office 2010 Plus. Just used Power Point 2010 Animation called Spin Animation.

In the animation pane you can select the animation and click for the menu. Selecting Effect Options lets you set the Amount for example to Full Spin, Half Spin, etc. You can also set the spin Amount to Custom and write the number of degrees. This didn't work for me until I wrote a new number but kept the degrees sign, so " 540 " didn't work, " 540° " works. You also need to hit the Enter key for it to catch.

Asaf

"office 2010" spin animation "effect options" custom amount not working

by AsafShelly | with no comments
תגים:
media player rip music to this location missing
Friday, December 23, 2011 11:54 AM

Using WMP you cannot set the RIP directory. Probably because it was set to a network location or a removable such as a disk-on-key.

On WMP's toolbar "Organize" -then "Manage Libraries" then "Music". Select any folder path that does not exist and click "Remove".

See Allan's answer for more information here: http://answers.microsoft.com/en-us/windows/forum/windows_7-sound/have-lost-the-ability-to-rip-music-with-win7/a1d9f4f8-1e7f-40b8-9c49-03ed907f0af3

I'm posting this becuase it was far from the first hit in a search.

by AsafShelly | with no comments
תגים:
Windows Embedded Compact 7 Book
Saturday, October 15, 2011 11:05 PM

If you are interested in Windows Embedded Compact 7 you should take a look at Avi Kcholi's new book "Pro Windows Embedded Compact 7: Producing Device Drivers". Avi is the number one expert in Israel and is one of the leading figures world wide.

Soon to be published, you can already find it on Amazon: http://www.amazon.com/Pro-Windows-Embedded-Compact-Producing/dp/1430241799/

Enjoy!

Asaf

by AsafShelly | with no comments
תגים:, ,
Interview @ Intel IDF
Saturday, October 15, 2011 10:59 PM

Hi All,

This is the interview I gave Intel last month at the Intel Developers Forum in San Francisco.

http://software.intel.com/en-us/videos/black-belt-developer-asaf-shelly-at-idf-2011/

It has a few hints to future innovations.

Asaf

An Interesting Review Of Windows 8
Tuesday, October 04, 2011 7:16 AM

I think that people should really listen to this.. especially Microsoft people

http://altabel.wordpress.com/2011/09/28/windows-8-five-reasons-people-might-want-to-stay-away/

by AsafShelly | with no comments
תגים:, ,
השב"כ מחפש מומחה ארכיטקטורת פיתוח
Friday, September 23, 2011 5:27 AM

השב"כ מחפש מומחה ארכיטקטורת פיתוח וזה נשמע לי תפקיד מפתה ויוקרתי מאד. אני מפרסם את זה בין השאר כי לא נפתחות הרבה משרות לארכיטקטים.

קישור למודעה: https://www.shabak.gov.il/jobs/alljobs/computres/Pages/129.aspx

אפשר לשלוח קו"ח גם אל: it.shabak@gmail.com

בהצלחה,

אסף

 

by AsafShelly | with no comments
תגים:, , ,
C# Library Version
Tuesday, May 24, 2011 8:19 PM

Colleting this from different sources.

Looking for a library version similar to __DATE__ __TIME__ you need to use:

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()

For this to change every build you need to go to project properties, 'Application' tab, open 'Assembly Information', and set the last value in 'Assembly Version' to * so instead of Assembly Version of 1.0.0.0 it should be 1.0.0.* ; This will cause an increment for every build (to verify modify code or rebuild).

by AsafShelly | with no comments
תגים:,
Softtalkblog Interviewed Me
Tuesday, April 26, 2011 2:09 PM

Here is the link: http://softtalkblog.com/2011/04/26/programmer-profile-asaf-shelly/

If you are reading this in the UK or Germany and interested in Parallel Computing then you are welcome to join the event for networking and technical discussions with Intel's representatives and myself

C# Convert Generic Type
Sunday, April 03, 2011 2:09 PM

I am posting this because I didn't see a simple solution on the first few hits when searching the net.

If you have a generic class of type T and you want to use it with basic types such as int, long, etc. You can use the following method to do the casting:

class myClass<T>
{
   private int myVal;
   public T Get()
   {
      return ((T)(Convert.ChangeType(myVal, typeof(T))));
   }

}

enum SomeEnum { One = 1, Two = 3 }
myClass<SomeEnum> X;
SomeEnum se = X.Get();

You can also use: (TYPE)(retval as IConvertible).ToType(typeof( ....

This is relevant because native types require casting and you cannot use the 'as' keyword.

(for search engines: C# Convert Generic Type to int enum, conversion, float double. Casting an enumeration. c# generic constraints. C# Constraints on Type Parameters.

Asaf

by AsafShelly | with no comments
תגים:,
More Posts Next page »