উইন্ডোজ কাঁটাচামচ () সবচেয়ে নিকটতম জিনিস কি?


124

আমার মনে হয় প্রশ্নটি সব বলেছে।

আমি উইন্ডোজ কাঁটাচামচ করতে চান সর্বাধিক অনুরূপ অপারেশন কী এবং আমি কীভাবে এটি ব্যবহার করব।

উত্তর:


86

সাইগউইন উইন্ডোজটিতে পুরোপুরি কাঁটাচামচ () বৈশিষ্ট্যযুক্ত। সুতরাং যদি সাইগউইন ব্যবহার আপনার পক্ষে গ্রহণযোগ্য হয় তবে সমস্যাটি যদি সমস্যার সমাধান হয় তবে ক্ষেত্রে পারফরম্যান্স কোনও সমস্যা নয়।

অন্যথায় আপনি কীভাবে সাইগউইন কাঁটাচামচ প্রয়োগ করেন ()। বেশ পুরানো সাইগউইনের আর্কিটেকচার ডক থেকে :

5.6। প্রক্রিয়া তৈরির সাইগউইনে কাঁটাচামচ কলটি বিশেষ আকর্ষণীয় কারণ এটি উইন 32 এপিআইয়ের শীর্ষে মানচিত্রটি ভাল করে না। এটি সঠিকভাবে প্রয়োগ করা খুব কঠিন করে তোলে। বর্তমানে, সাইগউইন কাঁটাচামচ একটি অনুলিপি-অন-লিখন বাস্তবায়ন যা ইউনিক্সের প্রাথমিক স্বাদে উপস্থিত ছিল present

প্রথম জিনিসটি যখন ঘটে থাকে যখন কোনও পিতামাতার প্রক্রিয়া একটি শিশু প্রক্রিয়া জোর করে তোলে তা হ'ল পিতা-মাতা সন্তানের জন্য সাইগউইন প্রক্রিয়া সারণিতে একটি স্থান শুরু করে। এটি তখন উইন 32 ক্রিয়েটপ্রসেস কলটি ব্যবহার করে স্থগিত করা শিশু প্রক্রিয়া তৈরি করে। এরপরে, প্যারেন্ট প্রসেসটি তার নিজস্ব প্রসঙ্গ সংরক্ষণ করার জন্য সেটজ্যাম্পকে কল করে এবং সাইগউইন শেয়ার করা মেমরি এরিয়ায় (সমস্ত সাইগউইন কার্যক্রমে ভাগ করা) এটিতে একটি পয়েন্টার সেট করে। এটি স্থগিত বাচ্চার ঠিকানা স্থানে তার নিজের ঠিকানা স্থান থেকে অনুলিপি করে সন্তানের .ডাটা এবং .bss বিভাগগুলিতে পূরণ করে। সন্তানের ঠিকানা স্থানটি শুরু করার পরে, পিতা-মাতা একটি মিটেক্সে অপেক্ষা করার সময় শিশুটি চালানো হয়। শিশুটি আবিষ্কার করে যে এটি সংরক্ষিত জাম্প বাফার ব্যবহার করে কাঁটাচামচ করা হয়েছে এবং লংজাম্পগুলি রয়েছে। তারপরে সন্তানের পিতামাতারা অপেক্ষা করা মিটেক্স সেট করে এবং অন্য মিটেক্সে ব্লক করে। এটি পিতামাতার পক্ষে এটির স্ট্যাকটি অনুলিপি করার এবং বাচ্চাকে হিপ করার জন্য সংকেত এটির পরে এটি শিশুটি অপেক্ষা করা মুটেক্স প্রকাশ করে এবং কাঁটাচামচ কল থেকে ফিরে আসে। শেষ অবধি, শিশুটি সর্বশেষ মুটেক্সে ব্লক করা থেকে জেগে ওঠে, ভাগ করা অঞ্চলের মধ্য দিয়ে কোনও মেমরি-ম্যাপযুক্ত অঞ্চল এটি পুনরায় তৈরি করে এবং নিজেই কাঁটাচামচ থেকে ফিরে আসে।

পিতা-মাতার এবং সন্তানের প্রক্রিয়ার মধ্যে প্রসঙ্গের সুইচগুলির সংখ্যা হ্রাস করে কীভাবে আমাদের কাঁটাচামচ বাস্তবায়নের গতি বাড়ানোর বিষয়ে আমাদের কিছু ধারণা রয়েছে, উইঙ্ক 32 এর অধীনে কাঁটাচামচি প্রায় সর্বদা অদক্ষ হয়ে থাকবে। ভাগ্যক্রমে, বেশিরভাগ পরিস্থিতিতে সাইগউইন সরবরাহিত কলগুলির স্প্যান পরিবারকে কেবলমাত্র কিছুটা চেষ্টা করে একটি কাঁটাচামচ / এক্সিকিউটিভ জুটির জন্য প্রতিস্থাপন করা যেতে পারে। উইন 32 এপিআই-র শীর্ষে এই কলগুলি মানচিত্রটি পরিষ্কার করে দেয়। ফলস্বরূপ, তারা অনেক বেশি দক্ষ। কাঁটাচলার পরিবর্তে স্পোন কল করতে সংকলকের ড্রাইভার প্রোগ্রাম পরিবর্তন করা একটি তুচ্ছ পরিবর্তন ছিল এবং আমাদের পরীক্ষায় সংকলনের গতি বিশ থেকে ত্রিশ শতাংশ বৃদ্ধি পেয়েছিল।

যাইহোক, স্পন এবং এক্সিকিউট তাদের নিজস্ব সেট সেট করে। উইন 32 এর অধীনে প্রকৃত সম্পাদন করার কোনও উপায় নেই বলে, সাইগউইনকে নিজস্ব প্রসেস আইডি (পিআইডি) আবিষ্কার করতে হবে। ফলস্বরূপ, যখন কোনও প্রক্রিয়া একাধিক এক্সিকিউটিভ কল করে, সেখানে একক সিগউইন পিআইডি যুক্ত একাধিক উইন্ডোজ পিআইডি থাকবে। কিছু ক্ষেত্রে, এই উইন 32 প্রসেসের প্রত্যেকটির স্টাবগুলি দীর্ঘায়িত হতে পারে, তাদের নির্বাহী সাইগউইন প্রক্রিয়াটি প্রস্থান হওয়ার জন্য অপেক্ষা করে।

অনেক কাজ মনে হচ্ছে, তাই না? এবং হ্যাঁ, এটি স্লুওউও।

সম্পাদনা: ডকটি পুরানো, দয়া করে একটি আপডেটের জন্য এই দুর্দান্ত উত্তরটি দেখুন


11
আপনি যদি উইন্ডোজে কোনও সাইগউইন অ্যাপ্লিকেশন লিখতে চান তবে এটি একটি ভাল উত্তর। তবে সাধারণভাবে এটি করা ভাল নয়। মূলত, * নিক্স এবং উইন্ডোজ প্রক্রিয়া এবং থ্রেড মডেলগুলি বেশ আলাদা। ক্রিয়েটপ্রসেস () এবং ক্রিয়েটথ্রেড () হ'ল সাধারণ সমতুল্য এপিআই
ফোরডেকার

2
বিকাশকারীদের মনে রাখা উচিত যে এটি একটি অসমর্থিত প্রক্রিয়া, এবং আইআইআরসি প্রকৃতপক্ষে যখনই সিস্টেমটিতে অন্য কোনও প্রক্রিয়া কোড ইঞ্জেকশন ব্যবহার করছে তখনই এটি ভেঙে যেতে বাধ্য।
হ্যারি জনস্টন

1
বিভিন্ন প্রয়োগের লিঙ্কটি আর বৈধ নয়।
পাইথননট

কেবলমাত্র অন্য উত্তর লিঙ্কটি রেখে সম্পাদিত
লরিয়ানাস বিভিনিস

@ ফোরেডেকার, আসলে আপনি "সাইগউইন অ্যাপ্লিকেশন" লেখার চেষ্টা করছেন এমনকি আপনার এটি করা উচিত নয় । এটি ইউনিক্সের অনুকরণ করার চেষ্টা করে forkএখনও এটি একটি ফাঁস সমাধান সহ এটি সম্পাদন করে এবং আপনাকে অপ্রত্যাশিত পরিস্থিতির জন্য প্রস্তুত থাকতে হবে।
পেসারিয়ার

66

আমি অবশ্যই এর বিশদটি জানি না কারণ আমি এটি কখনই করি নি, তবে দেশীয় এনটি এপিআই-তে কোনও প্রক্রিয়া তৈরি করার ক্ষমতা রয়েছে (উইন্ডোজের পসিক্স সাবসিস্টেমটির এই ক্ষমতা প্রয়োজন - আমি নিশ্চিত নই যে পসিক্স সাবসিস্টেম এমনকি সমর্থিত হয়)।

ZwCreateProcess () এর অনুসন্ধানে আপনার আরও কিছু বিশদ পাওয়া উচিত - উদাহরণস্বরূপ ম্যাক্সিম শটস্কিহ থেকে এই বিট তথ্য :

এখানে সর্বাধিক গুরুত্বপূর্ণ পরামিতি সেকশনহ্যান্ডল। যদি এই প্যারামিটারটি নুল হয় তবে কার্নেলটি বর্তমান প্রক্রিয়াটিকে কাঁটাচামচ করবে। অন্যথায়, এই প্যারামিটারটি অবশ্যই ZWCreateProcess () কল করার আগে EXE ফাইলে তৈরি SEC_IMAGE বিভাগ অধ্যায়টির হ্যান্ডেল হওয়া উচিত।

যদিও লক্ষ করুন যে কর্নিনা ভিনচেন ইঙ্গিত করেছেন যে সাইগউইন জেডউক্রিয়েটপ্রসেস () ব্যবহার করে এখনও বিশ্বাসযোগ্য নয় :

ইকার অ্যারিজেন্ডি লিখেছেন:

> Because the Cygwin project relied solely on Win32 APIs its fork
> implementation is non-COW and inefficient in those cases where a fork
> is not followed by exec.  It's also rather complex. See here (section
> 5.6) for details:
>  
> http://www.redhat.com/support/wpapers/cygnus/cygnus_cygwin/architecture.html

এই দস্তাবেজটি বরং পুরানো, 10 বছর বা তার বেশি। কাঁটা অনুকরণ করার জন্য আমরা এখনও উইন 32 কল ব্যবহার করছি, তবে পদ্ধতিটি লক্ষণীয়ভাবে পরিবর্তিত হয়েছে। বিশেষত, আমরা আর স্থগিত অবস্থায় শিশু প্রক্রিয়াটি তৈরি করি না, যদি না নির্দিষ্ট ডাটাস্ট্রিক্টস সন্তানের অনুলিপি করার আগে পিতামাতার মধ্যে একটি বিশেষ হ্যান্ডলিংয়ের প্রয়োজন না হয়। বর্তমান 1.5.2.2 রিলিজে স্থগিত সন্তানের একমাত্র ক্ষেত্রে পিতামাতার খোলা সকেট। আসন্ন 1.7.0 প্রকাশটি মোটেও স্থগিত করবে না।

ZwCreateProcess ব্যবহার না করার একটি কারণ হ'ল 1.5.25 রিলিজ অবধি আমরা এখনও উইন্ডোজ 9 এক্স ব্যবহারকারীদের সমর্থন করছি। যাইহোক, এনটি-ভিত্তিক সিস্টেমে জেডব্রেসিটপ্রসেস ব্যবহারের দুটি প্রচেষ্টা একটি কারণ বা অন্য কারণে ব্যর্থ হয়েছে।

এটি সত্যই সুন্দর হবে যদি এই জিনিসগুলি আরও ভাল বা সমস্ত নথিভুক্ত হয়, বিশেষত বেশ কয়েকটি ডেটাস্ট্রাকচার এবং কীভাবে কোনও প্রক্রিয়াটিকে একটি সাবসিস্টেমের সাথে সংযুক্ত করতে হয়। যদিও কাঁটাচামচ একটি উইন 32 ধারণা নয়, আমি দেখতে পাচ্ছি না যে কাঁটাচামালি কার্যকর করা সহজ করা খারাপ জিনিস হবে।


এটি ভুল উত্তর। ক্রিয়েটপ্রসেস () এবং ক্রিয়েটথ্রেড () হ'ল সাধারণ সমতুল্য।
ফোরডেকার

2
: Interix "ইউনিক্স ফর এপ্লিকেশনস সাবসিস্টেম" উইন্ডোজ ভিস্তা এন্টারপ্রাইজ / যেমন আলটিমেট পাওয়া যায় en.wikipedia.org/wiki/Interix
bk1e

15
@ ফোরডেকার - এটি একটি ভুল উত্তর হতে পারে তবে ক্রিয়েটপ্রসেস () / ক্রিয়েটথ্রেড () খুব ভালও হতে পারে। এটি 'জিনিসগুলি করার জন্য উইন 32 উপায়' বা 'কাঁটাচামচ () যতটা সম্ভব শব্দার্থকতার কাছাকাছি' অনুসন্ধান করছে কিনা তার উপর নির্ভর করে। ক্রিয়েটপ্রসেস () কাঁটাচামচ () এর চেয়ে আলাদাভাবে আচরণ করে, এই কারণেই সাইগউইনকে সমর্থন করার জন্য প্রচুর কাজ করার প্রয়োজন হয়েছিল।
মাইকেল বুড়

1
@ জোন: আমি লিঙ্কগুলি ঠিক করতে এবং প্রাসঙ্গিক পাঠ্যটি উত্তরটিতে অনুলিপি করার চেষ্টা করেছি (যাতে ভবিষ্যতে ভাঙা লিঙ্কগুলি কোনও সমস্যা নয়)। যাইহোক, এই উত্তরটি অনেক আগে থেকেই যে আমি আজকে পাওয়া ১০০% উদ্ধৃতি তা নয় যেটি আমি ২০০৯ সালে উল্লেখ করছি
মাইকেল বারার

4
লোকেরা যদি " forkতাত্ক্ষণিকভাবে exec" চায় তবে সম্ভবত ক্রিয়েটপ্রসেস একজন প্রার্থী। তবে forkছাড়া execপ্রায়শই কাঙ্ক্ষিত হয় এবং এটিই ড্রাইভারদের সত্যিকারের জন্য জিজ্ঞাসা করে fork
অ্যারন ম্যাকডেইড

37

ওয়েল, উইন্ডোতে আসলে এর মতো ভালো কিছু নেই। বিশেষত যেহেতু কাঁটাচামচটি ধারণাভাবে একটি থ্রেড বা প্রসেস * নিক্সে তৈরি করতে ব্যবহৃত হতে পারে।

সুতরাং, আমি বলতে হবে:

CreateProcess()/CreateProcessEx()

এবং

CreateThread()(আমি শুনেছি যে সি অ্যাপ্লিকেশনগুলির জন্য, _beginthreadex()ভাল)।


17

লোকেরা উইন্ডোজে কাঁটাচামচ প্রয়োগ করার চেষ্টা করেছে। এটি এটির কাছের জিনিসটি আমি খুঁজে পেতে পারি:

থেকে নেওয়া হয়েছে: http://dogen.scilab.org/5.3/d0/d8f/forkWindows_8c_source.html#l00216

static BOOL haveLoadedFunctionsForFork(void);

int fork(void) 
{
    HANDLE hProcess = 0, hThread = 0;
    OBJECT_ATTRIBUTES oa = { sizeof(oa) };
    MEMORY_BASIC_INFORMATION mbi;
    CLIENT_ID cid;
    USER_STACK stack;
    PNT_TIB tib;
    THREAD_BASIC_INFORMATION tbi;

    CONTEXT context = {
        CONTEXT_FULL | 
        CONTEXT_DEBUG_REGISTERS | 
        CONTEXT_FLOATING_POINT
    };

    if (setjmp(jenv) != 0) return 0; /* return as a child */

    /* check whether the entry points are 
       initilized and get them if necessary */
    if (!ZwCreateProcess && !haveLoadedFunctionsForFork()) return -1;

    /* create forked process */
    ZwCreateProcess(&hProcess, PROCESS_ALL_ACCESS, &oa,
        NtCurrentProcess(), TRUE, 0, 0, 0);

    /* set the Eip for the child process to our child function */
    ZwGetContextThread(NtCurrentThread(), &context);

    /* In x64 the Eip and Esp are not present, 
       their x64 counterparts are Rip and Rsp respectively. */
#if _WIN64
    context.Rip = (ULONG)child_entry;
#else
    context.Eip = (ULONG)child_entry;
#endif

#if _WIN64
    ZwQueryVirtualMemory(NtCurrentProcess(), (PVOID)context.Rsp,
        MemoryBasicInformation, &mbi, sizeof mbi, 0);
#else
    ZwQueryVirtualMemory(NtCurrentProcess(), (PVOID)context.Esp,
        MemoryBasicInformation, &mbi, sizeof mbi, 0);
#endif

    stack.FixedStackBase = 0;
    stack.FixedStackLimit = 0;
    stack.ExpandableStackBase = (PCHAR)mbi.BaseAddress + mbi.RegionSize;
    stack.ExpandableStackLimit = mbi.BaseAddress;
    stack.ExpandableStackBottom = mbi.AllocationBase;

    /* create thread using the modified context and stack */
    ZwCreateThread(&hThread, THREAD_ALL_ACCESS, &oa, hProcess,
        &cid, &context, &stack, TRUE);

    /* copy exception table */
    ZwQueryInformationThread(NtCurrentThread(), ThreadBasicInformation,
        &tbi, sizeof tbi, 0);
    tib = (PNT_TIB)tbi.TebBaseAddress;
    ZwQueryInformationThread(hThread, ThreadBasicInformation,
        &tbi, sizeof tbi, 0);
    ZwWriteVirtualMemory(hProcess, tbi.TebBaseAddress, 
        &tib->ExceptionList, sizeof tib->ExceptionList, 0);

    /* start (resume really) the child */
    ZwResumeThread(hThread, 0);

    /* clean up */
    ZwClose(hThread);
    ZwClose(hProcess);

    /* exit with child's pid */
    return (int)cid.UniqueProcess;
}
static BOOL haveLoadedFunctionsForFork(void)
{
    HANDLE ntdll = GetModuleHandle("ntdll");
    if (ntdll == NULL) return FALSE;

    if (ZwCreateProcess && ZwQuerySystemInformation && ZwQueryVirtualMemory &&
        ZwCreateThread && ZwGetContextThread && ZwResumeThread &&
        ZwQueryInformationThread && ZwWriteVirtualMemory && ZwClose)
    {
        return TRUE;
    }

    ZwCreateProcess = (ZwCreateProcess_t) GetProcAddress(ntdll,
        "ZwCreateProcess");
    ZwQuerySystemInformation = (ZwQuerySystemInformation_t)
        GetProcAddress(ntdll, "ZwQuerySystemInformation");
    ZwQueryVirtualMemory = (ZwQueryVirtualMemory_t)
        GetProcAddress(ntdll, "ZwQueryVirtualMemory");
    ZwCreateThread = (ZwCreateThread_t)
        GetProcAddress(ntdll, "ZwCreateThread");
    ZwGetContextThread = (ZwGetContextThread_t)
        GetProcAddress(ntdll, "ZwGetContextThread");
    ZwResumeThread = (ZwResumeThread_t)
        GetProcAddress(ntdll, "ZwResumeThread");
    ZwQueryInformationThread = (ZwQueryInformationThread_t)
        GetProcAddress(ntdll, "ZwQueryInformationThread");
    ZwWriteVirtualMemory = (ZwWriteVirtualMemory_t)
        GetProcAddress(ntdll, "ZwWriteVirtualMemory");
    ZwClose = (ZwClose_t) GetProcAddress(ntdll, "ZwClose");

    if (ZwCreateProcess && ZwQuerySystemInformation && ZwQueryVirtualMemory &&
        ZwCreateThread && ZwGetContextThread && ZwResumeThread &&
        ZwQueryInformationThread && ZwWriteVirtualMemory && ZwClose)
    {
        return TRUE;
    }
    else
    {
        ZwCreateProcess = NULL;
        ZwQuerySystemInformation = NULL;
        ZwQueryVirtualMemory = NULL;
        ZwCreateThread = NULL;
        ZwGetContextThread = NULL;
        ZwResumeThread = NULL;
        ZwQueryInformationThread = NULL;
        ZwWriteVirtualMemory = NULL;
        ZwClose = NULL;
    }
    return FALSE;
}

4
নোট করুন যে বেশিরভাগ ত্রুটি পরীক্ষা করা অনুপস্থিত - যেমন ZwCreateThread একটি NTSTATUS মান প্রদান করে যা সফল এবং ব্যর্থ ম্যাক্রোগুলি ব্যবহার করে চেক করা যায়।
বিসিআরএন

1
forkক্রাশ হলে কী ঘটে , প্রোগ্রামটি ক্রাশ হয়, বা থ্রেডটি ক্র্যাশ করলে? যদি এটি প্রোগ্রামটি ক্র্যাশ করে, তবে এটি সত্যিই কাঁটাচামচ নয়। শুধু কৌতূহলী, কারণ আমি একটি আসল সমাধান খুঁজছি, এবং আশা করি এটি একটি শালীন বিকল্প হতে পারে।
leetNightshade

1
আমি নোট করতে চাই প্রদত্ত কোডে একটি বাগ আছে। #LoadeFunitionsForFork শিরোনামে একটি গ্লোবাল ফাংশন, তবে সি ফাইলে একটি স্ট্যাটিক ফাংশন। তাদের উভয়ই বিশ্বব্যাপী হওয়া উচিত। এবং বর্তমানে কাঁটাচলার ক্র্যাশ, এখন পরীক্ষা করে ত্রুটি যুক্ত করা হচ্ছে।
leetNightshade

সাইটটি মারা গেছে এবং আমি জানি না যে আমি কীভাবে নিজের সিস্টেমে উদাহরণটি সংকলন করতে পারি। আমি ধরে নিচ্ছি আমি কিছু শিরোনাম অনুপস্থিত বা ভুলগুলি সহ আমি আছি? (উদাহরণটি তাদের দেখায় না))
পল স্টেলিয়ান

6

মাইক্রোসফ্ট তাদের নতুন "উইন্ডোজ ফর লিনাক্স সাবসিস্টেম" বিকল্পটি প্রবর্তন করার আগে উইন্ডোজকে CreateProcess()সবচেয়ে কাছের জিনিস ছিল fork(), তবে উইন্ডোজ আপনাকে সেই প্রক্রিয়াতে চালনার জন্য নির্বাহী নির্দিষ্ট করতে হবে।

ইউনিক্স প্রক্রিয়া তৈরির বিষয়টি উইন্ডোজের থেকে একেবারেই আলাদা। এর fork()কলটি মূলত বর্তমান প্রসেসটি প্রায় সম্পূর্ণরূপে প্রতিটির নিজস্ব ঠিকানার জায়গায় সদৃশ করে এবং পৃথকভাবে এগুলি চালিয়ে চলেছে। প্রক্রিয়াগুলি নিজেরাই আলাদা হলেও তারা এখনও একই প্রোগ্রাম চালাচ্ছে মডেলের একটি ভাল ওভারভিউ জন্য এখানে দেখুন fork/exec

অন্যান্য উপায় ফিরে যাওয়া, উইন্ডোজের সমতুল্য CreateProcess()হয় fork()/exec() যুগল ইউনিক্স মধ্যে ফাংশন।

আপনি যদি উইন্ডোজে সফ্টওয়্যারটি বন্দর করছেন এবং কোনও অনুবাদ স্তরটি আপনার আপত্তি নেই তবে সাইগউইন আপনার যে সক্ষমতা চান তা সরবরাহ করেছেন তবে এটি ছিল ক্লডজি।

অবশ্যই, সঙ্গে নতুন লিনাক্স সাব-সিস্টেম , সর্বনিকটবর্তী বস্তু উইন্ডোজ হয়েছে fork()হয় আসলে fork() :-)


2
সুতরাং, ডাব্লুএসএল দেওয়া, আমি কি forkগড়পড়তা, ডাব্লুএসএল অ্যাপ্লিকেশন ব্যবহার করতে পারি ?
সিজার

6

নিম্নলিখিত দস্তাবেজটি ইউএনআইএক্স থেকে উইন 32-এ পোর্টিং কোড সম্পর্কিত কিছু তথ্য সরবরাহ করে: https://msdn.microsoft.com/en-us/library/y23kc048.aspx

অন্যান্য জিনিসের মধ্যে এটি ইঙ্গিত দেয় যে প্রক্রিয়া মডেল দুটি সিস্টেমের মধ্যে একেবারেই আলাদা এবং ক্রিয়েটপ্রসেস এবং ক্রিয়েটথ্রেডের বিবেচনার প্রস্তাব দেয় যেখানে কাঁটাচামচ () - যেমন আচরণের প্রয়োজন হয়।


4

"আপনি যখনই ফাইল অ্যাক্সেস বা প্রিন্টফ করতে চান তবেই আইও প্রত্যাখ্যান করা হয়েছে"

  • আপনার কেক থাকতে পারে না এবং এটিও খেতে পারবেন না ... এমএসভিসিআরটি.ডিএল-তে, প্রিন্টফ () কনসোল এপিআই-এর উপর ভিত্তি করে তৈরি করা হয়েছে, যা নিজেই কনসোল সাবসিস্টেমের সাথে যোগাযোগের জন্য এলপিসি ব্যবহার করে (csrss.exe)। প্রসেস স্টার্ট-আপ-এ সিএসআরএসের সাথে সংযোগ শুরু করা হয় যার অর্থ যে "যে প্রক্রিয়া" এর মাঝখানে "শুরু হয় তার সেই পদক্ষেপ বাদ দেওয়া হবে। অপারেটিং সিস্টেমের সোর্স কোডটিতে আপনার অ্যাক্সেস না থাকলে সিএসআরএসকে ম্যানুয়ালি সংযোগ দেওয়ার চেষ্টা করার কোনও মানে নেই। পরিবর্তে, আপনার নিজের সাবসিস্টেম তৈরি করা উচিত এবং সেই অনুসারে কাঁটাচামচ ব্যবহার করে এমন অ্যাপ্লিকেশনগুলিতে কনসোল ফাংশনগুলি এড়ানো উচিত।

  • একবার আপনি নিজের সাবসিস্টেমটি প্রয়োগ করে নিলে, শিশু প্রক্রিয়াটির জন্য পিতামাতার সমস্ত হ্যান্ডেলগুলিও নকল করতে ভুলবেন না ;-)

"এছাড়াও, কার্নেল মোডে না থাকলে আপনার সম্ভবত Zw * ফাংশন ব্যবহার করা উচিত নয়, পরিবর্তে আপনার সম্ভবত Nt * ফাংশন ব্যবহার করা উচিত।"

  • এটি ভুল। যখন ব্যবহারকারী মোডে অ্যাক্সেস করা হয় তখন জেডব্লু *** এনটি *** এর মধ্যে একেবারেই কোনও পার্থক্য নেই; এগুলি কেবল দুটি পৃথক (ntdll.dll) রফতানির নাম যা একই (আপেক্ষিক) ভার্চুয়াল ঠিকানার উল্লেখ করে।

ZwGetContextThread (এনটিসিভারেন্টথ্রেড (), এবং প্রসঙ্গ);

  • ZwGetContextThread কল করে বর্তমান (চলমান) থ্রেডের প্রসঙ্গটি পাওয়া ভুল, ক্রাশ হওয়ার সম্ভাবনা রয়েছে এবং (অতিরিক্ত সিস্টেম কলের কারণে )ও কাজটি সম্পাদনের দ্রুততম উপায় নয়।

2
এটি প্রধান প্রশ্নের উত্তর দিচ্ছিল না তবে কয়েকটি অন্যান্য ভিন্ন উত্তরের জবাব দিচ্ছে বলে মনে হচ্ছে, এবং সম্ভবত স্পষ্টতার জন্য প্রত্যেকে সরাসরি উত্তর দেওয়া ভাল হবে এবং যা চলছে তা অনুসরণ করা সহজ করে তুলবে।
লে

আপনি মনে করছেন যে প্রিন্টফ সর্বদা কনসোলে লেখেন।
জেসেন

3

কাঁটা () শব্দার্থকগুলি প্রয়োজনীয় যেখানে তাত্ক্ষণিক কাঁটাচামচ () নামক কল হিসাবে সন্তানের পিতামাতার আসল স্মৃতি অবস্থানে অ্যাক্সেস প্রয়োজন। আমার কাছে একটি টুকরা সফ্টওয়্যার রয়েছে যা তাত্ক্ষণিক কাঁটাচামচ () নামে পরিচিত হিসাবে মেমরির অনুলিপি করা ম্যাপেক্সের উপর নির্ভর করে যা থ্রেডগুলি ব্যবহার করা অসম্ভব করে তোলে। (এটি আধুনিক * নিক্স প্ল্যাটফর্মগুলিতে অনুলিপি-অন-রাইটিং / আপডেট-মেমরি-টেবিল শব্দার্থের মাধ্যমে অনুকরণ করা হয়))

উইন্ডোজটিতে সিস্কল হিসাবে সর্বাধিক নিকটে থাকা হ'ল ক্রিয়েটপ্রসেস। সর্বোত্তম যেটি করা সম্ভব তা হ'ল পিতা-মাতার পক্ষে সেই সময়ে সমস্ত অন্যান্য থ্রেড হিমায়িত করা হয় যখন এটি নতুন প্রক্রিয়ার মেমোরি স্পেসে মেমরি অনুলিপি করে থাকে, তারপরে সেগুলি গলান। সাইগ্রউইনের ফ্রক [সিক] শ্রেণি বা সাইরিব কোড যেটিই পোস্ট করেছেন তা এরিক ডেস কোর্টিস থ্রেড-হিমায়িত করে না, যা আমি দেখতে পাচ্ছি।

এছাড়াও, আপনি কার্নেল মোডে না থাকলে আপনার সম্ভবত Zw * ফাংশন ব্যবহার করা উচিত নয়, পরিবর্তে আপনার সম্ভবত Nt * ফাংশন ব্যবহার করা উচিত। এখানে একটি অতিরিক্ত শাখা রয়েছে যা আপনি কার্নেল মোডে আছেন কিনা তা যাচাই করে এবং যদি না হয় তবে এনটি * সর্বদা করে এমন সমস্ত সীমা পরীক্ষা করে এবং প্যারামিটার যাচাই করে। সুতরাং, ব্যবহারকারী মোড থেকে তাদের কল করা খুব সামান্য দক্ষ।


জেডব্লিউ * রফতানি প্রতীক সম্পর্কিত খুব আকর্ষণীয় তথ্য, আপনাকে ধন্যবাদ।
অ্যান্ডন এম। কোলেম্যান

মনে রাখবেন যে সুরক্ষার জন্য, জেডডাব্লু * ফাংশনগুলি কার্নেল স্পেসে এনটি * ফাংশনগুলিতে ব্যবহারকারী স্থান থেকে ম্যাপ করে। বা কমপক্ষে তাদের করা উচিত।
পল স্টেলিয়ান


2

উইন্ডোজটিতে কাঁটাচামচ () অনুকরণ করার কোনও সহজ উপায় নেই।

আমি আপনাকে পরিবর্তে থ্রেড ব্যবহার করার পরামর্শ দিচ্ছি।


ঠিক আছে, ন্যায্যতার সাথে বাস্তবায়ন forkকরা ঠিক সাইগ্রউইনকে করেছিল। তবে, আপনি কীভাবে কীভাবে তা পর্যালোচনা করে যদি তা পড়ে থাকেন তবে "কোন সহজ উপায় নয়" এটি একটি স্থূল ভুল ধারণা :-)
প্যাক্সিডিয়াবলো

2

সবচেয়ে কাছের আপনি যা বলেছেন ... আমাকে ভাবতে দাও ... এটি অবশ্যই কাঁটাচামচ () আমি অনুমান করি :)

বিশদগুলির জন্য দেখুন ইন্টারিক্স কাঁটাচামচ প্রয়োগ করে ()?



2

অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, এনটি (উইন্ডোজের মূল সংস্করণে কার্নেল) এর ইউনিক্স ফর্ক () সমতুল্য। সমস্যা নেই।

সমস্যাটি হ'ল কোনও প্রক্রিয়ার পুরো রাজ্যের ক্লোনিং করা সাধারণত কোনও বুদ্ধিমান কাজ নয়। উইন্ডোজে যেমন ইউনিক্স জগতে এটি ঠিক তেমনি সত্য, তবে ইউনিক্স বিশ্বে কাঁটাচামচ () সর্বদা ব্যবহৃত হয় এবং লাইব্রেরিগুলি এটির জন্য নকশাকৃত করা হয়। উইন্ডোজ লাইব্রেরি হয় না।

উদাহরণস্বরূপ, সিস্টেম ডিএলএলগুলি কার্নেল 32.dll এবং ব্যবহারকারী 32.dll উইন 32 সার্ভার প্রক্রিয়া csrss.exe এর সাথে একটি ব্যক্তিগত সংযোগ বজায় রাখে। কাঁটাচামচ পরে, সেই সংযোগের ক্লায়েন্টের শেষে দুটি প্রক্রিয়া রয়েছে, যা সমস্যা তৈরি করতে চলেছে। শিশু প্রক্রিয়াটির csrss.exe এর অস্তিত্ব সম্পর্কে অবহিত করা উচিত এবং একটি নতুন সংযোগ করা উচিত - তবে এটি করার কোনও ইন্টারফেস নেই, কারণ এই গ্রন্থাগারগুলি কাঁটাচামচ () মাথায় রেখে তৈরি করা হয়নি।

সুতরাং আপনার দুটি পছন্দ আছে। একটি হ'ল কার্নেল 32 এবং ইউজার 32 এবং অন্যান্য লাইব্রেরি যা কাঁটাচালিত নকশাকৃত নয় - এমন কোনও লাইব্রেরি যা প্রত্যক্ষ বা অপ্রত্যক্ষভাবে কার্নেল 32 বা ব্যবহারকার 32 এর সাথে সংযুক্ত রয়েছে, যা কার্যত সমস্তগুলি ব্যবহার করে। এর অর্থ হ'ল আপনি উইন্ডোজ ডেস্কটপের সাথে কিছুতেই ইন্টারেক্ট করতে পারবেন না এবং আপনার নিজের আলাদা ইউনিক্সির জগতে আটকে আছেন। এটি এনটি-র জন্য বিভিন্ন ইউনিক্স সাবসিস্টেমগুলি নিয়েছে approach

অন্য বিকল্পটি কাঁটাচামচ () দিয়ে কাজ করার জন্য অজানা গ্রন্থাগারগুলি পাওয়ার চেষ্টা করার জন্য এক ধরণের ভয়ঙ্কর হ্যাকের অবলম্বন করা। সাইগউইন তাই করেন। এটি একটি নতুন প্রক্রিয়া তৈরি করে, এটিকে আরম্ভ করতে দেয় (csrss.exe দিয়ে নিজেকে নিবন্ধকরণ সহ), তারপরে পুরানো প্রক্রিয়া থেকে বেশিরভাগ গতিশীল অবস্থার অনুলিপি করে এবং সেরাটির জন্য আশা করে। এটি আমাকে অবাক করে দেয় যে এটি কখনও কাজ করে। এটি অবশ্যই নির্ভরযোগ্যভাবে কাজ করে না - এমনকি যদি কোনও ঠিকানা স্থানের দ্বন্দ্বের কারণে এটি এলোমেলোভাবে ব্যর্থ না হয়, আপনি যে কোনও গ্রন্থাগার ব্যবহার করছেন তা নীরবে ভাঙ্গা অবস্থায় থাকতে পারে। সাইগউইনের একটি "সম্পূর্ণ-বৈশিষ্ট্যযুক্ত কাঁটাচামচ ()" রয়েছে তা বর্তমান স্বীকৃত উত্তরের দাবি ... সন্দেহজনক।

সংক্ষিপ্তসার: একটি ইন্টারিক্স-মতো পরিবেশে আপনি কাঁটাচামচ () কল করে কাঁটাচামচ করতে পারেন। অন্যথায়, দয়া করে এটি করার আকাঙ্ক্ষা থেকে নিজেকে দুগ্ধ দেওয়ার চেষ্টা করুন। এমনকি আপনি সাইগউইনকে টার্গেট করছেন এমনকি যদি না আপনি একেবারে না থাকেন তবে কাঁটাচামচ () ব্যবহার করবেন না।


1

আপনি যদি কেবল একটি উপ-প্রসেস তৈরি এবং এটির জন্য অপেক্ষা করেন তবে সম্ভবত _ স্প্যান * এপিআই'র প্রক্রিয়াটি হ'ল যথেষ্ট। সে সম্পর্কে আরও তথ্য এখানে:

https://docs.microsoft.com/en-us/cpp/c-runtime-library/process-and-enomot-control https://en.wikedia.org/wiki/Process.h

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.