2010-09-18 5 views
1

Je dois ouvrir un fichier à l'aide de l'API ZwOpenFile. Ceci est mon exigence. Lorsque je définis le chemin dans le paramètre de nom d'objet. Je pouvais voir les champs Longueur et longueur maximale dans le nom de l'objet.trébuché dans l'utilisation de ZwOpenFile

La longueur est juste la longueur du chemin et je garde habituellement la longueur maximum en tant que valeur de longueur.

Cela a fonctionné principalement, mais parfois cela ne fonctionne pas. Dans certains cas, je l'ai résolu via maximumlength = length * 2. Même ce calcul ne fonctionne pas pour quelques autres cas.

Je suis très intrigué par le calcul de la valeur Maximumlength.

Peut-on aider.

+0

Utilisez-vous RtlInitUnicodeString pour initialiser votre chaîne? –

+0

Je modifie le chemin du fichier entrant. d'où les longueurs ont été changées. J'avais l'habitude de le calculer via rtlunicodestring (la manière de rite). Mais ce n'est pas contextuellement le même. Ensuite, à travers les codes de vin, j'ai trouvé une fois que nous modifions le nom du chemin du fichier, nous devons le convertir en ntfilepathname (/ ?? /). Pour cela, nous devons utiliser RTL_dospathnametontpathname_u. Ce qui nous donne automatiquement la chaîne Unicode. cette conversion a fonctionné. Thnaks pour votre intérêt –

+0

Pourquoi utilisez-vous ZwOpenFile? Quelles fonctionnalités fournit-il que CreateFile ne fournit pas? –

Répondre

0

Regardez la définition de la structure UNICODE_STRING: link

Longueur est wcslen (str.Buffer) * sizeof (WCHAR) == * 2

champ MaximumLength peut être Longueur + sizeof (WCHAR) == Longueur + ZwOpenFile n'écrira pas à cette chaîne, donc nous ne devrions pas nous soucier de la capacité de la chaîne.

+0

J'ajoute un chemin virtuel dans le chemin entrant de zwopenfile. par conséquent je dois éditer l'attribut d'objet dedans. Cependant, le calcul que vous avez montré fonctionnera. merci –

+0

J'ai accroché zwopenfile. donc je serai dans l'implémentation, pour éditer son paramètre à mon besoin. –

0

Initialement, j'ai converti le nom de chemin d'accès manuellement avec/?? /. Ce n'était pas réglé. Puis je l'ai essayé en utilisant RTL_dospathnametontpathname_u, ce qui m'a donné une chaîne unicode. Ensuite, il est travaillé pour mon cas. De même, on utilisera normalement l'API api de codage à base de code de base, comme "Will A" suggéré.

Merci.