2008-10-06 7 views
6

पर साझा मेमोरी एक्सेस अनुमतियां मैंने एक विंडोज़ एप्लीकेशन विकसित किया है जो साझा मेमोरी का उपयोग करता है --- यह है --- इंटरप्रोसेस संचार के लिए मेमोरी मैप की गई फाइलें। मेरे पास एक विंडोज़ सेवा है जो कुछ प्रसंस्करण करता है और समय-समय पर स्मृति मैप किए गए फ़ाइल में डेटा लिखता है। मेरे पास एक अलग विंडोज़ एप्लिकेशन है जो मेमोरी मैप की गई फाइल से पढ़ता है और जानकारी प्रदर्शित करता है। एप्लिकेशन विंडोज एक्सपी, एक्सपी प्रो और सर्वर 2003 पर अपेक्षित काम करता है, लेकिन Vista पर नहीं।विंडोज

मैं देख सकता हूं कि मेमोरी मैप किए गए फ़ाइल में लिखा गया डेटा विंडोज सेवा द्वारा सही ढंग से हो रहा है क्योंकि मैं एक टेक्स्ट एडिटर के साथ फ़ाइल खोल सकता हूं और संग्रहीत संदेशों को देख सकता हूं, लेकिन "उपभोक्ता" एप्लिकेशन पढ़ नहीं सकता फ़ाइल से यहां ध्यान देने योग्य एक दिलचस्प बात यह है कि अगर मैं उपभोक्ता अनुप्रयोग बंद करता हूं और इसे पुनरारंभ करता हूं, तो यह उन संदेशों को खपत करता है जो पहले मेमोरी मैप किए गए फ़ाइल में लिखे गए थे।

इसके अलावा, एक और अजीब चीज यह है कि जब मैं रिमोट डेस्कटॉप का उपयोग कर विंडोज होस्ट से कनेक्ट करता हूं और दूरस्थ डेस्कटॉप के माध्यम से उपभोक्ता अनुप्रयोग का उपयोग/उपयोग करता हूं तो मुझे वही व्यवहार मिलता है। हालांकि, अगर मैं रिमोट डेस्कटॉप का आह्वान करता हूं और निम्न होस्ट के साथ लक्ष्य होस्ट के कंसोल सत्र से कनेक्ट करता हूं: mstsc -v:servername /F -console, सब कुछ पूरी तरह से काम करता है।

इसलिए मुझे लगता है कि समस्या अनुमतियों से संबंधित है। क्या कोई इस पर टिप्पणी कर सकता है?

संपादित करें:

एसीएल कि मैं स्मृति मैप की गई फ़ाइल और Mutex वस्तुओं कि sychronize पहुँच इस प्रकार है बनाने के लिए उपयोग कर रहा हूँ:

TCHAR * szSD = TEXT("D:") 
       TEXT("(A;;RPWPCCDCLCSWRCWDWOGAFA;;;S-1-1-0)") 
       TEXT("(A;;GA;;;BG)") 
       TEXT("(A;;GA;;;AN)") 
       TEXT("(A;;GA;;;AU)") 
       TEXT("(A;;GA;;;LS)") 
       TEXT("(A;;GA;;;RD)") 
       TEXT("(A;;GA;;;WD)") 
       TEXT("(A;;GA;;;BA)"); 

मैं इस मुद्दे का हिस्सा हो सकता लगता है ।

उत्तर

0

क्या आपने फ़ाइल को किसी दूसरे स्थान पर ले जाने का प्रयास किया है। इसे 'साझा दस्तावेज़' फ़ोल्डर में डालने का प्रयास करें, यह Vista में सबसे अधिक आसानी से सुलभ फ़ोल्डर प्रतीत होता है।

+0

साझा दस्तावेज़ आईपीसी संबंधित फाइलों के लिए एक बेहद असुरक्षित स्थान है - ऐसा मत करें। –

1

साझा स्मृति अनुभाग के साथ आप किस एक्सेस को खोल रहे हैं? FILE_MAP_ALL_ACCESS के साथ प्रयास करें और अपना रास्ता नीचे चलाएं। यह भी सुनिश्चित करें कि आपके पास निर्माता और उपभोक्ताओं के बीच दौड़ की स्थिति नहीं है - कौन सा साझा स्मृति बना रहा है? सुनिश्चित करें कि दूसरे को खोलने की कोशिश करने से पहले ths बनाया गया है। एक तरीका है कि आप बच्चे की प्रक्रिया शुरू करने से पहले माता-पिता में अनुभाग बनाना चाहते हैं - यदि आप माता-पिता/बाल वास्तुकला का उपयोग कर रहे हैं।

साझा मेमोरी तक पहुंच की अनुमति देने के लिए आपके बच्चे को Vista पर ऊंचा चलाने की आवश्यकता हो सकती है। यह आपके द्वारा उपयोग किए जा रहे विंडो सत्र से भी संबंधित हो सकता है। सत्र 0 में चलने वाली सेवाएं (मुझे लगता है) जबकि अन्य ऐप्स (विशेष रूप से यदि आप दूरस्थ डेस्कटॉप के माध्यम से लॉग इन करते हैं) दूसरे सत्र में चल सकते हैं।

+0

इसलिए मैं साझा स्मृति को मैप करने के लिए FILE_MAP_ALL_ACCESS का उपयोग कर रहा हूं और मैंने कोड डिज़ाइन किया है ताकि इससे कोई फर्क नहीं पड़ता कि पहले साझा स्मृति कौन बनाता है। लेकिन सत्र के बारे में आपका सुझाव दिलचस्प है। मैं इसमें देख लूंगा। –

6

तो मैं मेरी समस्या का हल मिल गया:

Windows XP पर, सभी नामित गिरी वस्तुओं जैसे म्युटेक्स, सेमाफोर और स्मृति मैप की गई वस्तुओं में एक ही नाम स्थान में संग्रहीत हैं। इसलिए जब अलग-अलग उपयोगकर्ता सत्रों में विभिन्न प्रक्रियाएं किसी विशेष वस्तु को इसके नाम का उपयोग करके संदर्भित करती हैं, तो वे उस ऑब्जेक्ट को एक हैंडल प्राप्त करते हैं। हालांकि, एक सुरक्षा सावधानी के रूप में, विंडोज टर्मिनल सेवाएं इसके सत्र में शुरू की गई प्रक्रियाओं से संदर्भित कर्नेल ऑब्जेक्ट्स के लिए एक अलग नेमस्पेस बनाती हैं। विंडोज विस्टा में इस व्यवहार को भी बनाया गया है, इसलिए यही कारण है कि मेरा ऐप Vista पर सही तरीके से काम नहीं करता है। विस्तृत करने के लिए, मेरे पास एक विंडोज सेवा है जो शून्य सत्र में चलता है और एक एप्लिकेशन जो उपयोगकर्ता सत्र में चलता है, इसलिए मेरी नामित वस्तुओं को अलग-अलग नामस्थानों में बनाया जा रहा था।

इस समस्या के लिए त्वरित समाधान प्रत्येक कर्नेल ऑब्जेक्ट नाम पर "ग्लोबल \" तैयार करके ग्लोबल नेमस्पेस का उपयोग करके मैंने उपयोग किया और यह चाल चल रही थी।

+0

आपने शायद अपने सिस्टम पर एक सुरक्षा छेद बनाया है। –

+1

वैसे उस पर मिश्रित विचार हैं। ऐसे समय होते हैं जब आप किसी उपयोगकर्ता एप्लिकेशन की तुलना में उच्च अधिकार और क्षमता (स्थानीय सिस्टम कहें) देना चाहते हैं, जिसे उस सेवा के साथ इंटरफ़ेस करने में सक्षम होना आवश्यक है। तर्कसंगत है कि आप केवल सेवा देकर सुरक्षा सक्षम कर रहे हैं, न कि ऐप को एक्सेस करने वाले ऐप। हालांकि आप इस तथ्य को देख सकते हैं कि सेवा एक संभावित सुरक्षा छेद के रूप में मौजूद है। लेकिन मैं असहमत हूं। – Dan

3

उपसर्ग "ग्लोबल \" साझा स्मृति पर काम नहीं कर सकता है। समाधान के लिए "Impact of Session 0 Isolation on Services and Drivers in Windows Vista" देखें।

+2

यह दस्तावेज़ मेरे समाधानों को मान्य करता है ... यह बताता है "उपयोगकर्ता अनुप्रयोगों के लिए सेवा के साथ सिंक्रनाइज़ करने का सही तरीका स्पष्ट रूप से वैश्विक \ prefix का उपयोग करना है"। –