Delen via


Overname van pijpgreep

De pijpserver bepaalt of de ingangen ervan op de volgende manieren kunnen worden overgenomen:

  • De functie CreatePipe ontvangt een SECURITY_ATTRIBUTES structuur. Als de pijpserver de bInheritHandle lid van deze structuur instelt op TRUE-, kunnen de ingangen die zijn gemaakt door CreatePipe- worden overgenomen.
  • De pijpserver kan de functie DuplicateHandle gebruiken om de overname van een pijpgreep te wijzigen. De pipe-server kan een niet-herheriteerbaar duplicaat maken van een overgenomen pijpgreep of een overgenomen duplicaat van een niet-heritable pipe-ingang.
  • Met de functie CreateProcess kan de pijpserver opgeven of een onderliggend proces alle of geen van de overgenomen ingangen overneemt.

Wanneer een onderliggend proces een pijpgreep over neemt, kan het proces toegang krijgen tot de pijp. Het bovenliggende proces moet de handlewaarde echter doorgeven aan het onderliggende proces. Het bovenliggende proces doet dit meestal door de standaarduitvoergreep om te leiden naar het onderliggende proces, zoals wordt weergegeven in de volgende stappen:

  1. Roep de GetStdHandle--functie aan om de huidige standaarduitvoergreep op te halen; sla deze ingang op zodat u de oorspronkelijke standaarduitvoergreep kunt herstellen nadat het onderliggende proces is gemaakt.
  2. Roep de SetStdHandle--functie aan om de standaarduitvoergreep in te stellen op de schrijfgreep naar de pijp. Nu kan het bovenliggende proces het onderliggende proces maken.
  3. Roep de CloseHandle--functie aan om de schrijfgreep naar de pijp te sluiten. Nadat het onderliggende proces de schrijfgreep heeft overgenomen, heeft het bovenliggende proces de kopie niet meer nodig.
  4. Roep SetStdHandle- aan om de oorspronkelijke standaarduitvoergreep te herstellen.

Het onderliggende proces maakt gebruik van de GetStdHandle--functie om de standaarduitvoergreep op te halen. Dit is nu een ingang voor het schrijven van een pijp. Het onderliggende proces gebruikt vervolgens de WriteFile--functie om de uitvoer naar de pijp te verzenden. Wanneer het kind klaar is met de pijp, moet deze de greep van de pijp sluiten door CloseHandle- aan te roepen of door de greep te beƫindigen, waardoor de greep automatisch wordt gesloten.

Het bovenliggende proces maakt gebruik van de functie ReadFile om invoer van de pijp te ontvangen. Gegevens worden naar een anonieme pijp geschreven als een stroom van bytes. Dit betekent dat het bovenliggende proces dat vanuit een pijp leest, geen onderscheid kan maken tussen de bytes die in afzonderlijke schrijfbewerkingen zijn geschreven, tenzij zowel de bovenliggende als de onderliggende processen een protocol gebruiken om aan te geven waar de schrijfbewerking eindigt. Wanneer alle schrijfgrepen naar de pijp worden gesloten, retourneert de ReadFile-functie nul. Het is belangrijk dat het bovenliggende proces de ingang van de greep tot het schrijfeinde van de pijp sluit voordat u ReadFile-aanroept. Als dit niet is gebeurd, kan de ReadFile-bewerking geen nul retourneren omdat het bovenliggende proces een open ingang heeft voor het schrijfeinde van de pijp.

De procedure voor het omleiden van de standaardinvoergreep is vergelijkbaar met die voor het omleiden van de standaarduitvoergreep, behalve dat de leesgreep van de pijp wordt gebruikt als de standaardinvoergreep van het kind. In dit geval moet het bovenliggende proces ervoor zorgen dat het onderliggende proces de schrijfgreep van de pijp niet overneemt. Als dit niet gebeurt, kan de ReadFile- bewerking die door het onderliggende proces wordt uitgevoerd, geen nul retourneren omdat het onderliggende proces een open ingang heeft tot het schrijfeinde van de pijp.

Zie Een onderliggend proces maken met omgeleide invoer en uitvoervoor een voorbeeldprogramma dat anonieme pijpen gebruikt om de standaardgrepen van een onderliggend proces om te leiden.