 اسم اللہ الرحمن الرحیم، آج ہم موڈیول 94 دیسکریں گے، موڈیول 94 ہے about duplicating handles. جب پیرنٹ کو ایک چیلڈ پروسسیس کریٹ کرتا تو عام طور پہ چیلڈ کو پیرنٹ کے رسورسیس چاہی ہوتے ہیں. کچھ رسورسیس ایسے ہوں گے جو چیلڈ کو چاہی ہوں گے، کچھ ایسے رسورسیس ہوں گے جو پیرنٹ ہائیٹ کرنا چاہے گا. تو لیکن جو اوورلپنگ رسورسیس ہوں گے، اس کے لیے پھر پیرنٹ یہ بھی چاہتا ہو کہ جو ایکسیس رائٹس ان کو لیمیٹٹ کیا جائے. یعنی کہ چیلڈ کو وہ رائٹس نہیں ہوں گے جو پیرنٹ کیوں گے. یعنی کہ چیلڈ ہو سکتا ہے، اس کو یہ رائٹ نہ ہو کہ وہ رسورسیس کو ترمینیٹ کر سکے. لیکن پیرنٹ کو یہ رائٹ ہو کہ وہ چیلڈ کو ترمینیٹ کر سکے. تو اس سے یہ ثابت ہوتا ہے کہ جو ایک آپ نے رسورس کریئٹ کیا، اس رسورس کے آپ کو ملٹیبل ہینڈلز کی زود پر سکتی ہے. ملٹیبل ہینڈلز کیوں؟ کیونکہ اس کو چیلڈ نے بھی use کرنا، اس کو پیرنٹ نے بھی use کرنا، چیلڈ نے different تریکے سے use کرنا، چیلڈ کے ایکسیس رائٹس different ہوں گے، پیرنٹ کے ایکسیس رائٹس different ہو سکتا ہے. پھر اسی طرح ہم نے دیکھا کہ اگر ایک پیرنٹ پروسس ہے تو وہ اپنا ہینڈل کیسے گیٹ کرتا ہے، وہ ہینڈل جب وہ API کو کال کرتا ہے اس کو گیٹ ہینڈل کے تھرو، اس کو ایک ہینڈل ریٹان ہوتا ہے جوکہ سوڈو ہینڈل ہوتا ہے. تو آپ کو وہ سوڈو ہینڈل جو ہے اس کے اندار ایکسیس رائٹس نہیں دفائند ہوتا ہے، تو آگے چلکے پیرنٹ کو زود پڑتی ہے کہ وہ ایک ریل ہینڈل گیٹ کرے جسکن در ایکسیس رائٹس دفائند ہو۔ تو ایسا کرنے کے لیے پھر کیا کیا ہوتا ہے؟ دپلکیٹ ہینڈلز بنائے جاتے ہیں، ان دونوں پروبلومس کو سلوشن کیا ہے کہ آپ دپلکیٹ ہینڈلز کریٹ کریں، اگر آپ ایک ہی پرسورس ہے اس کے رائٹس چیلڈ کو بھی دےنا چاہتے ہیں اور پیرنٹ کو بھی دےنا چاہتے ہیں تو دپلکیٹ ہینڈلز ہوں گے، پیرنٹ کے پاس دفرنت ہوگا، چیلڈ کے پاس ایک دفرنت ہینڈل ہوگا، ایک آپ کے پاس سوڈو ہینڈل ہے تو آپ چاتے ہیں آپ کے پاس ریل ہینڈل ہو، تو اس کا ایک دپلکیٹ ہینڈل جو ہے کریٹ کیا ہے اسکن۔ تو ایسا کرنے کے لیے ہمارے پاس ایپیائی موجود ہے دپلکیٹ ہینڈل، دپلکیٹ ہینڈل کی ایپیائی کو use کرتے ہوئے آپ ایک ہینڈل کیا ڈینٹیکل کوپی کریٹ کر سکتے ہیں اور اس کے اندر اس کے جو رائٹس ہیں یا اس کو جو سکوپ ہے اس کو بھی چینج کر سکتے ہیں اس کے لیے ایپیائی دیکھتے ہیں یہ آپ کو بولین رٹن کرے گی اس کے اندر source process ہینڈل ایک ہینڈل تو a source process ہینڈل اور ایک ہینڈل تو a source handle ایک target process ہینڈل ہے اور ایک target ہینڈل ہے جو source process ہینڈل ہے یا آپ کے source process کا ہینڈل ہے یعنی کہ جس process کو اس دپلکیٹ ہینڈل کی ضرورت پڑے گی اور یہ جو long pointer to target ہینڈل ہے اس کو pointر ملے گی pointر یہ بسکلی ایک pointر ہے to a handle اس کو ایک pointر ملے گا to the original handle جوکہ اس ایپیائی نے handle کرنے اور دپلکیٹ ہینڈل بنانا ہے وہ اس کا handle اس کا دپلکیٹ بنے گا وہ target handle کو return ہوگا اور دپلکیٹ کیس handle کا ہوگا source handle کا ہوگا source handle ایک handle ہے جس کا کیا آپ نے دپلکیٹ کریٹ کرنے source handle کیدر لائے کرتا ہے source handle process کے اندر لائے کرتا ہے جب اس کا دپلکیٹ بنے گا تو وہ کس کے اندر آئے گا اس کا reference آئے گا lp target handle کے اندر جو process duplicate handle منار ہے عام طور وہ parent process ہوگا تو اس کے پاس کس طرح کی رائٹس ہونے چاہیئے اس کے پاس access ہونے چاہیئے process duplicate handle یعنی کہ dup handle یعنی کہ اس کے پاس write ہونا چاہیئے کہ یہ کسی ایک handle کا duplicate handle کریٹ کر سکے otherwise یہ فیل ہو جائے گا اگر جو آپ نے source handle سپیسفائی کیا یعنی کہ جس handle کا آپ نے duplicate بنانا ہے وہ source handle in valid ہے یا exist نہیں کرتا تو اس کیس میں بھی یہ function جو ہے فیل ہو جائے گا اور یہ جو target handle بنے گا آپ کے پاس یہ صرف آپ کا جو target process handle ہے target process handle والا جو process ہے اسی کے اندر یہ handle valid ہوگا اسی کے اندر یہ use ہو سکتا ہوگا عام طور پہ کیا ہوتا ہے جو most یعنی کہ typical scenario اس typical scenario کے اندر کیا ہوتا ہے جو source handle ہوتا ہے جو source handle آپ duplicate کرنا چاہ رہے ہیں وہ source process میں سے آتا ہے وہ source handle ہوتا ہے اور وہ ملتا کس کو ہے وہ target process کو مل رہا ہوتا ہے اور ان کیس یہ duplication کوئی اور کرا تو اس کیس کے اندر جس جب یہ duplication ہوتی ہے تو آپ کو target process کو اسی طرح سے یہ communicate کرنا بڑے گا کہ اس handle کا duplicate ہوگے اور وہ duplicate handle جو ہے اس کو pass بھی کسی طریقے سے کرنا بڑے گا کسی mechanism کے through communication mechanism کے through وہ handle جو ہے اس کو pass کرنا بڑے گا اس کا mechanism آپ کو کوئی بنانا بڑے گا ویسے typically parent child کے اندر جو source process ہوگا وہ duplicate کر رہا ہوگا اور target process جو ہے اس کو وہ target handle receive ہوگا اور یہ صرف process handle کو duplicate کرنے کے لیے نہیں use ہوتا یہ کسی بھی طرح کہ handle کو duplicate کرنے کے لیے استعمال کیا ہے سکتا ہے یعنی کہ کوئی ایک resource ہے اس کا handle ہے اس کو بھی duplicate کرنے کے لیے use کیا ہے سکتا صرف processes کے handles کو duplicate کرنے گا یہ یعنی کہ ایک general purpose APIہ windows کے اندر جو dw option that can be combination of two flags flags کیا ہے duplicate close source یعنی کہ جب آپ ایک handle as source دے رہے ہیں اور اس کا ایک duplicate بناتے ہیں تو اگر آپ نے یہویلی option set کیا تو source handle automatically close ہو جاتا ہے اور آپ کے پاس ایک copy آ جاتی ہے with a different set of access rights اور پھر دوسری option ہے duplicate same access اس کس کے اندر آپ کے پاس جو source handle ہے اس کے جو access rights ہیں وہی access rights جو تھی وہ copy ہو جاتے ہیں into the target handle اور اس کے اس میں جو desired access ڈی دی بلیو desired access اس کو یہ پھر اگنور کرتے گی یہاں بہت ایک important point جو آپ کو سمجھنے کے ضرورت ہے windows کے اندر ایک reference mechanism ہے ایک reference count مینٹین کرتا ہے windows ہر handle جو ہے وہ windows کا ایک resource ہے اور windows کا کام یہ ہے کہ اپنے resources کو manage کرنا ایک handle جو ہے وہ کسی ایک resource کا handle ہے ایک resource کو manage کرنے کے لیے وہ use ہو رہا ہے تو جب بھی وہ ایک handle create کرے گا windows تو وہ اس کا reference اپنے پاس رکھے گا اس کا count اپنے پاس مینٹین کرے گا in case ایک resource کی کئی handles کی copies بنتی ہیں تو windows کو پہلا ہوتا ہے کہ اس کے کس resource کی کتنی handles کی copies موجود ہیں اور جب تک آپ ساری کی ساری copies کو کلوز نہیں کر دتے آپ وہ handle جو ہے یہاں پہاں ایک بڑا ضروری mechanism ہے جو آپ کو پتا ہونا چاہیے جب آپ handles کو duplicate کرے وہ mechanism جو ہے وہ windows کا اپنا reference mechanism ہے windows جو ہے وہ ایک reference count مینٹین کر رہا ہے for all the handles for all the resources windows کا basically کام ہی resource management ہے operating system کا کام resource management ہے تو جو بھی ایک resource allocate ہوتا ہے جس کے لیے ایک handle بنتا ہے windows کو پتا ہے کون سے resource allocate ہونے میں اور کون کون سے handles بنے میں اور جب بھی آپ نے handle کی copy بنانی ہے تب بھی آپ نے windows ہوئی کہنا ہے کہ جو مجھے اس کی copy بنا تو windows کو exactly پتا ہے کہ کس resource کے handle کی کتنی copies exist کرتی ہیں تو وہ اس نے ہر handle کا count رکھا ہوا ہے اگر آپ نے کئی copies بنالی ہیں کہ handle کو windows کو exact اس کا count پتا ہے اب اگر آپ اس handle کو کلوز کرنا چاہیں گے تو وہ invalidate نہیں ہوگا وہ کب تک invalidate نہیں ہوگا جب تک آپ اس کی جتنی بھی copies ہے ان ساری copies کو کلوز نکا داتے ہیں تو یہ چیز بڑی ضروری ہے آپ کو پتا ہونے چاہئے کہ اگر ایک چیز کے multiple handles ہے آپ نے سارے handles کو کلوز کرنا اس کے بعد ہی اس resource کو آپ release کر سکتے ہیں invalidate کر سکتے ہیں اس handle کو otherwise وہ نہیں ہوگا اس کس کے اندر جو inherited handles ہوتے ہیں inherit ہوکے اگر multiple آپ کے پاس handle آئے ہیں یا duplicated آپ کے پاس multiple handle آئے ہیں تو دونوں کو وہ reference count کے اندر شامل کرتا ہے تو دونوں کا آپ کو پتا ہونا چاہئے programmer کو exactly پتا ہونا چاہئے جو logic اس نے duplicated یا inherit کرنے کے لیے use کیا بالکل اس کا reverse اس کو کرنا پڑے گا جب اس نے garbage collection perform کرنے