Aracılığıyla paylaş


Kanal Tutamacı Devralma

Kanal sunucusu, tutamaçlarının aşağıdaki yollarla devralınıp devralınamayacağını denetler:

  • CreatePipe işlevi SECURITY_ATTRIBUTES bir yapı alır. Kanal sunucusu bu yapının bInheritHandle üyesini TRUE olarak ayarlarsa, CreatePipe tarafından oluşturulan tanıtıcılar devralınabilir.
  • Kanal sunucusu, kanal tutamacının devralma işlemini değiştirmek için DuplicateHandle işlevini kullanabilir. Kanal sunucusu, devralınabilir bir kanal tutamacının doğasında olmayan bir yinelemesini veya devralınamaz kanal tutamacının devralınabilir bir kopyasını oluşturabilir.
  • CreateProcess işlevi, kanal sunucusunun alt işlemin devralınabilir tanıtıcılarının tümünü mü yoksa hiçbirini mi devraldığını belirtmesini sağlar.

Bir alt işlem bir boru tutamacını devraldığında, sistem işlemin boruya erişmesini sağlar. Ancak üst işlemin tanıtıcı değerini alt işleme iletmesi gerekir. Üst işlem bunu genellikle aşağıdaki adımlarda gösterildiği gibi standart çıkış tutamacını alt işleme yönlendirerek yapar:

  1. Geçerli standart çıkış tutamacını almak için GetStdHandle işlevini çağırın; alt işlem oluşturulduktan sonra özgün standart çıkış tutamacını geri yükleyebilmeniz için bu tutamacı kaydedin.
  2. Standart çıkış tutamacını kanala yazma tutamacını ayarlamak için SetStdHandle işlevini çağırın. Artık üst işlem alt işlemi oluşturabilir.
  3. Kanala yazma tutamacını kapatmak için CloseHandle işlevini çağırın. Alt işlem yazma tutamacını devraldıktan sonra, üst işlemin artık kopyasına ihtiyacı olmaz.
  4. Özgün standart çıkış tutamacını geri yüklemek için SetStdHandleçağırın.

Alt işlem, standart çıkış tutamacını almak için GetStdHandle işlevini kullanır ve bu da artık bir kanalın yazma ucunun tutamacıdır. Alt işlem daha sonra çıkışını kanala göndermek için WriteFile işlevini kullanır. Alt öğe boruyu bitirdiğinde, CloseHandle çağırarak veya tutamacı otomatik olarak kapatan sonlandırarak boru tutamacını kapatması gerekir.

Üst işlem, kanaldan giriş almak için ReadFile işlevini kullanır. Veriler anonim bir kanala bayt akışı olarak yazılır. Bu, hem üst hem de alt işlemler yazma işleminin nerede sona erdiğini belirtmek için bir protokol kullanmadığı sürece, bir kanaldan okuma üst işleminin ayrı yazma işlemlerinde yazılan baytları ayırt edemeyeceği anlamına gelir. Kanala yönelik tüm yazma tutamaçları kapatıldığında, readfile işlevi sıfır döndürür. ReadFileçağırmadan önce üst işlemin tutamacını kanalın yazma ucuna kapatması önemlidir. Bu yapılmazsa ReadFile işlemi sıfır döndüremez çünkü üst işlem kanalın yazma sonuna açık bir tanıtıcıya sahiptir.

Standart giriş tutamacını yeniden yönlendirme yordamı, standart çıkış tutamacını yeniden yönlendirmeye benzer, ancak kanalın okuma tutamacını alt bağlantının standart giriş tutamacı olarak kullanılır. Bu durumda, üst işlemin alt işlemin kanalın yazma tutamacını devralmadığından emin olması gerekir. Bu yapılmazsa, alt işlem tarafından gerçekleştirilen ReadFile işlemi, alt işlemin kanalın yazma sonuna açık bir tanıtıcısı olduğundan sıfır döndüremez.

Alt işlemin standart tanıtıcılarını yeniden yönlendirmek için anonim kanallar kullanan örnek bir program için bkz. Yeniden Yönlendirilen Giriş ve Çıkışile Alt İşlem Oluşturma .