NetShareEnum не дает результатов

Я работал над функцией перечисления общих ресурсов в Windows с использованием Win32 C++ и столкнулся с проблемой.

net share показывает все акции с акциями по умолчанию и это хорошо. Но по какой-то причине в приведенном ниже коде программа в результате не возвращает доли. Я пробовал использовать _SHARE_INFO_1, _SHARE_INFO_2 и _SHARE_INFO_501.

В IDA Free я вижу net.exe вызовы NetShareEnum() и получает имя сервера, которое, как мне кажется, от NetWkstaGetInfo(). Гидра говорит, что импорт есть, и не похоже, что есть какой-либо другой импорт для таких вещей, как GetComputerNameEx и т. д.

В любом случае, мне интересно, нужно ли мне вызывать логин, или, может быть, мой AV мешает мне или что-то в этом роде?

Вот код. Функция завершается знаком ERROR_SUCCESS. В отладке totalEntries и entriesRead после вызова функции равны нулю.

std::list<String> FileSystem::listShares() {
    std::list<String> shares;
    _SHARE_INFO_502* buffer, p;
    LPWKSTA_INFO_100 pBuf = NULL;
    NET_API_STATUS nStatus;

    // Retrieve workstation information at level 100
    nStatus = NetWkstaGetInfo(NULL, 100, (LPBYTE*)&pBuf);
    if (nStatus != NERR_Success) {
        Util::printError(L"NetWkstaGetInfo");
    }
    LPWSTR serverName = pBuf->wki100_computername;
    DWORD entriesRead;
    DWORD totalEntries;
    DWORD resumeHandle;
    DWORD result = NetShareEnum(serverName, 502, (LPBYTE*)&buffer, MAX_PREFERRED_LENGTH, &entriesRead, &totalEntries, &resumeHandle);
    std::wstringstream ss;
    if (result == 0) {
        for (DWORD i = 0; i < entriesRead; i++) {
            p = buffer[i];
            ss << L"Share Name: " << p.shi502_netname << L"\n\tShare Type: " << p.shi502_type << L"\n\tRemark: " << p.shi502_remark << std::endl;
            shares.push_back(ss.str());
            ss.str(L"");
        }
    }
    else {
        Util::printError(L"NetShareEnum");
    }
    return shares;
}

Что я делаю не так и как это исправить?

Уровень 501 не указан.
3CxEZiVlQ 07.07.2024 05:48

Я изменил его на 502. Все еще нет результатов. Обновил пост. @3CxEZiVlQ

seanlum 07.07.2024 06:01

Кроме того, если имя_сервера равно NULL, результаты остаются теми же.

seanlum 07.07.2024 06:40

Инициализируйте resumeHandle нулями.

Luke 07.07.2024 07:24
Learn.microsoft.com/en-us/windows/win32/wnet/…
Hans Passant 07.07.2024 20:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упомянул @Luke в комментарии, у вас неопределенное поведение, потому что вы неправильно инициализируете resumeHandle, поэтому результаты NetShareEnum() непредсказуемы.

Согласно документации NetShareEnum():

[вход, выход] summary_handle

Указатель на значение, содержащее дескриптор возобновления, который используется для продолжения существующего поиска в общих ресурсах. Дескриптор должен быть равен нулю при первом вызове и оставаться неизменным для последующих вызовов. Если возобновить_хандле имеет значение NULL, то дескриптор возобновления не сохраняется.

Это входной И выходной параметр, поэтому входное значение важно, но вы передаете неопределенное входное значение.


Кроме того, в случае сбоя NetWkstaGetInfo() у вас будет неопределенное поведение, так как при чтении pBuf->wki100_computername вы будете разыменовывать недопустимый указатель. И вы теряете его буфер, если это удается:

[выход] буфер

Указатель на буфер, который получает данные. Формат этих данных зависит от значения параметра level. Этот буфер выделяется системой и должен быть освобожден с помощью функции NetApiBufferFree. Дополнительные сведения см. в разделах «Буферы функций управления сетью» и «Длина буферов функций управления сетью».

Вы также пропускаете буфер NetShareEnum():

[выход] буфер

Указатель на буфер, который получает данные. Формат этих данных зависит от значения параметра level.

Этот буфер выделяется системой и должен быть освобожден с помощью функции NetApiBufferFree. Обратите внимание, что вы должны освободить буфер, даже если функция завершается с ошибкой ERROR_MORE_DATA.

Другие вопросы по теме