Я работал над функцией перечисления общих ресурсов в 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;
}
Что я делаю не так и как это исправить?
Я изменил его на 502. Все еще нет результатов. Обновил пост. @3CxEZiVlQ
Кроме того, если имя_сервера равно NULL
, результаты остаются теми же.
Инициализируйте resumeHandle
нулями.
Как упомянул @Luke в комментарии, у вас неопределенное поведение, потому что вы неправильно инициализируете resumeHandle
, поэтому результаты NetShareEnum()
непредсказуемы.
Согласно документации NetShareEnum():
[вход, выход] summary_handle
Указатель на значение, содержащее дескриптор возобновления, который используется для продолжения существующего поиска в общих ресурсах. Дескриптор должен быть равен нулю при первом вызове и оставаться неизменным для последующих вызовов. Если возобновить_хандле имеет значение NULL, то дескриптор возобновления не сохраняется.
Это входной И выходной параметр, поэтому входное значение важно, но вы передаете неопределенное входное значение.
Кроме того, в случае сбоя NetWkstaGetInfo()
у вас будет неопределенное поведение, так как при чтении pBuf->wki100_computername
вы будете разыменовывать недопустимый указатель. И вы теряете его буфер, если это удается:
[выход] буфер
Указатель на буфер, который получает данные. Формат этих данных зависит от значения параметра
level
. Этот буфер выделяется системой и должен быть освобожден с помощью функцииNetApiBufferFree
. Дополнительные сведения см. в разделах «Буферы функций управления сетью» и «Длина буферов функций управления сетью».
Вы также пропускаете буфер NetShareEnum()
:
[выход] буфер
Указатель на буфер, который получает данные. Формат этих данных зависит от значения параметра
level
.Этот буфер выделяется системой и должен быть освобожден с помощью функции
NetApiBufferFree
. Обратите внимание, что вы должны освободить буфер, даже если функция завершается с ошибкойERROR_MORE_DATA
.