क्या विंडोज के एक संस्करण ने कभी इस तरह से व्यवहार किया?


36

आज के डेली डब्ल्यूटीएफ लेख से प्रेरित है ।

लेखक का दावा है कि C:\Program.exeउदाहरण के लिए, शॉर्टकट पर क्लिक करने पर एक फ़ाइल निष्पादित की जाएगी C:\Program Files\Doom 2\doom2.exe -nomusic

माना जाता है, विंडोज पहले C:\Programतर्कों के साथ आह्वान करने का प्रयास करता है Files\Doom 2/doom2.exe -nomusic

अगर वहाँ नहीं है C:\Program.exe, तो यह C:\Program Files\Doomतर्कों के साथ कोशिश करता है 2/doom2.exe -nomusic

और अगर नहीं है C:\Program Files\Doom.exe\, तो यह अंततः कोशिश करता है C:\Program Files\Doom 2\doom2.exe -nomusicऔर सफल होता है।

यह मुझे पूरी बकवास लगती है। मुझे विश्वास नहीं हो रहा है कि यह कभी इस तरह से काम करेगा। एक टिप्पणीकार इसे अच्छी तरह से बताता है :

मुझे यह विश्वास करना कठिन लगता है कि विंडोज के किसी भी जारी संस्करण ने कभी भी ओपी द्वारा वर्णित परीक्षण-और-त्रुटि दृष्टिकोण किया था।

मैं पूरी तरह से मानता हूं कि विंडोज के एक रिलीज़ किए गए संस्करण में डिफ़ॉल्ट के रूप में मस्तिष्क-मृत व्यवहार था। मैंने इसे पहली बार कई बार अनुभव किया है।

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

स्पष्टता के लिए संपादित करें: यहाँ बताया गया है कि मैंने इसे स्वयं कैसे परखा।

  1. Notepad.exe को C: \ program.exe पर कॉपी करें
  2. C: \ program files \ Internet explorer \ iexplore.exe चलाएँ
  3. नोटपैड खुलता है। यह अपेक्षित है क्योंकि यह C: \ program नामक कुछ पाता है
  4. Progam.exe को C: \ program files \ Internet.exe में ले जाएँ
  5. C: \ program files \ Internet explorer \ iexplore.exe चलाएँ

लेख के लेखक के अनुसार ( और यह आलेख Microsoft से ), नोटपैड अभी भी खुला होना चाहिए। लेकिन यह नहीं है, इस संदेश के साथ कमांड विफल रहता है:

C:\program is not recognized as an internal or external command, operable program or batch file.

फिर, मैं लेख के दावे पर बहस नहीं कर रहा हूं कि C: \ program को लागू किया जाएगा। मैं यह तर्क दे रहा हूं कि विंडोज एक मैच हिट होने तक हर निर्देशिका को पुन: प्रयास करता है।

तो, क्या विंडोज के किसी भी संस्करण ने कभी इस तरह से काम किया?


1
हाँ ! यहाँ देखें @
ग्रेविटी

2
आपको सभी टिप्पणियों की जाँच करनी चाहिए;) msdn.microsoft.com/en-us/library/windows/desktop/…
Baarn

ऐसा लगता है कि यहां दो (या अधिक) अलग-अलग प्रश्न चल रहे हैं: क्या विंडोज़ आपको एक शॉर्टकट बनाने की अनुमति देगा C:\Program Files\..., और क्या विंडोज ऐसे शॉर्टकट (या रन कमांड, या कमांड-प्रॉम्प्ट कमांड, या कुछ अन्य विधि) की व्याख्या करेगा "C:\Program" Files\...। पहला भाग असंभावित लगता है, लेकिन दूसरा भाग मेरे लिए संभावित और अपेक्षित लगता है।
mwfearnley

एक तीसरा सवाल, मुझे लगता है, यह है: किसी भी विंडोज कमांड चल विधि के C:\Program Filesरूप में व्याख्या की जाएगी "C:\Program Files"? थोड़ा पढ़ने से, ऐसा लगता है कि कुछ मामलों में जवाब "हां" हो सकता है, जो वास्तव में एकमात्र अप्रत्याशित क्षेत्र है।
mwfearnley

जवाबों:


32

लंबे फ़ाइल नाम के बाद से विंडोज का हर संस्करण जहां जोड़ा विंडोज 95 और विंडोज 7 को शामिल करने के लिए इस तरह से काम करता है।

यह व्यवहार प्रलेखित है :

LpApplicationName पैरामीटर हो सकता है शून्य । उस स्थिति में, मॉड्यूल का नाम lpCommandLine स्ट्रिंग में पहले सफेद स्थान-सीमांकित टोकन होना चाहिए । यदि आप एक लंबी फ़ाइल नाम का उपयोग कर रहे हैं जिसमें एक स्थान शामिल है, तो यह बताने के लिए कि फ़ाइल नाम समाप्त होता है और तर्क शुरू होता है, उद्धृत स्ट्रिंग्स का उपयोग करें; अन्यथा, फ़ाइल नाम अस्पष्ट है। उदाहरण के लिए, स्ट्रिंग "c: \ program files \ sub dir \ program name" पर विचार करें। इस तार की व्याख्या कई तरीकों से की जा सकती है। सिस्टम निम्नलिखित क्रम में संभावनाओं की व्याख्या करने की कोशिश करता है:

c:\program.exe files\sub dir\program name
c:\program files\sub.exe dir\program name
c:\program files\sub dir\program.exe name
c:\program files\sub dir\program name.exe

जैसा कि यह इस तरह से पूछता है - ताकि यह उन कार्यक्रमों को न तोड़े, जो फ़ाइल नामों में रिक्त स्थान को सही ढंग से संभाल नहीं सकते हैं

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

कार्रवाई में इस व्यवहार को देखें:

  1. एक प्रशासनिक कमांड प्रॉम्प्ट खोलें
  2. चलाएँ: copy c:\Windows\System32\notepad.exe c:\program.exe
  3. चलाएँ: c:\Program Files\Internet Explorer\iexplore.exe
  4. नोटपैड आपको बताएगा कि यह नहीं मिल रहा है Files\Internet Explorer\iexplore.exe
  5. c:\Program Files\Internet Explorer\iexplore.exeरन विकल्प में टाइप करें और IE सही ढंग से खुल जाएगा।

संपादित करें 2 अपने C:\program files\internet.exeउदाहरण के मामले में ; मेरा मानना ​​है कि यह कमांड लाइन दुभाषिया रास्ते में हो रही है। यह कमांड लाइन को रिक्त स्थान से टूटे मापदंडों में कमांड लाइन को संसाधित और टोकन करने की कोशिश करता है। तो यह C:\programपहले टोकन के रूप में लेता है और यह व्याख्या करता है कि कार्यक्रम का नाम बाकी मापदंडों के रूप में है।

परीक्षण के लिए मैंने एक छोटा अनुप्रयोग बनाया जो CreateProcessसीधे कॉल करता है और यह बिल्कुल दस्तावेज के रूप में व्यवहार करता है। आपका C:\program files\internet.exeउदाहरण लॉन्च होगा C:\program files\internet.exe। तो यह प्रतीत होता है कि व्यवहार ठीक उसी तरह निर्भर करता है कि कैसे कमांड चलाया जाता है - कुछ इसे पारित करने से पहले कमांड लाइन को संसाधित कर सकता है CreateProcess

उदाहरण कार्यक्रम:

#include <Windows.h>

void main()
{
    STARTUPINFO si = {0};
    si.cb= sizeof(si);
    PROCESS_INFORMATION pi = {0};

    CreateProcess(NULL, "c:\\program files\\internet explorer\\iexplore.exe",
            NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}

1
यह मेरे सवाल का जवाब क्यों नहीं के लिए मेरा संपादन देखें। आपने केवल दिए गए आदेश में पहली बात का परीक्षण किया, मैं दूसरे के बारे में पूछ रहा हूं।
dpatchery

मैंने खुद पर थोड़ा और शोध किया है और मैं आपके नवीनतम संपादन से सहमत हूँ - ऐसा लगता है कि विसंगति cmd.exe और CreateProcess फ़ंक्शन के बीच है। रंग मुझे आश्वस्त!
19

इस भाग सही प्रतीत होता है नहीं: आपका C: \ Program Files \ internet.exe उदाहरण के लिए C का शुभारंभ करेंगे: \ Program Files \ internet.exe
डैनियल बेक

CreateProcessMSDN पर पृष्ठ के अनुसार , यह केवल तब होता है जब lpApplicationName पैरामीटर NULL होता है । अन्यथा, सिस्टम उस पैरामीटर को लॉन्च करने के कार्यक्रम के रूप में उपयोग करेगा और इसे खोजने के लिए खोज नहीं करेगा। मैं "रन" आदेश एक नहीं देती ग्रहण करेंगे शून्य यहाँ पैरामीटर, इसलिए, यह इस तरह से कार्यक्रम के लिए खोज नहीं होगा।
केविन पैंको

1
@ shf301 यह वास्तव में उपयोग करता है ShellExecuteExऔर फिर कॉल करता हैCreateProcess
केविन पैंको

5

मैं सिर्फ पिछले उत्तरों में कुछ जोड़ना चाहता हूं।

हालांकि इस व्यवहार को प्रयास, खराब प्रोग्रामिंग (आरटीएफएम नहीं), या इस विशेष एंटीवायरस प्रोग्राम के कारण होने वाली अपरिवर्तनीय सही तूफान के माध्यम से मजबूर करना संभव है, कुछ भी लेख द्वारा वर्णित व्यवहार का कारण नहीं होगा। किसी भी तरह से कोई शॉर्टकट सही तरीके से नहीं बनाया जाएगा, उदाहरण के लिए, "C: \ Program Files \ Microsoft \ Office \ Word.exe" को लक्षित करने वाले एक, उद्धरण के साथ, C: \ Program.exe चलाएं। फ़ायरफ़ॉक्स के साथ भी। नरक, यह एक शॉर्टकट बनाने के लिए मूल रूप से असंभव है जो ठीक से बच नहीं जाएगा, क्योंकि यह समझदारी से किया गया है।

यदि आप फ़ायरफ़ॉक्स की ओर इशारा करते हुए अपने डेस्कटॉप पर एक शॉर्टकट बनाते हैं, तो यह ठीक से बच जाएगा। यदि आप राइट-क्लिक करते हैं -> गुण और उद्धरण को हटाने का प्रयास करते हैं, तो यह स्वचालित रूप से आपको लगाएगा जब आप लागू होते हैं, भले ही सी: \ \ _.exe मौजूद हो। जब यह पार्स करता है, तो मुझे लगता है कि यह या तो फ़ोल्डर को वरीयता दे रहा है या पथ के हिस्से के रूप में अंतिम '\' से पहले सब कुछ का इलाज कर रहा है। केवल यदि आप प्रोग्राम और फ़ाइलों के बीच दो स्थान सम्मिलित करते हैं, तो इसे तर्कों के साथ C: \ Program.exe की ओर इंगित करते हुए पार्स किया जाएगा। यदि आप शॉर्टकट को टेक्स्ट एडिटर में एडिट कर सकते हैं (यह प्लेनटेक्स्ट नहीं है), तो यह काम कर सकता है।

शॉर्टकट की तरह, रन डायलॉग स्ट्रिंग को भी सही ढंग से पार्स करता है। केवल अपेक्षाकृत निम्न-स्तरीय कमांड कंसोल में यह गलत तरीके से C: \ Program.exe को कॉल करेगा, लेकिन यह अन्य विभिन्न संभावनाओं की कोशिश नहीं करेगा। यही है, यह गलत तरीके से "C: \ Program.exe" को कॉल करने का प्रयास करेगा, लेकिन "C: \ Program Files \ Internet.exe" या कुछ भी कॉल करने का प्रयास नहीं करेगा, भले ही वे संभावनाएं मौजूद हों। यह यह कहते हुए एक त्रुटि लौटाएगा कि यह C: \ Program.exe नहीं पा सकता है।

और इस सब के ऊपर, जब C: \ folder में एक Program.exe होता है, तो यह आपको स्टार्टअप पर चेतावनी देगा और पूछेगा कि क्या आप इसका नाम बदलना चाहते हैं। यह XP, Vista, विंडोज 7 के लिए सत्यापित किया गया है और मैं अब विंडोज 8 ( http://goo.gl/eeNCp ) को सत्यापित कर सकता हूं । शायद यह विंडोज 9x में संभव था, लेकिन मुझे संदेह है।

निचला रेखा, यह स्पष्ट है और कोई भी विंडोज प्रोग्रामर यह गलती नहीं करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.